Regex для экземпляров в STEP-файлах?

Мне нужно разобрать некоторые STEP-файлы (ISO-10303-21) из разных CAD-систем, и они всегда имеют разную структуру. Это формы, которые могут появиться:

#95=STYLED_ITEM('',(#94),#92);
#12 = CARTESIAN_POINT ( 'NONE',  ( 1.213489432997839200,
5.617300827691964000, -7.500000000000001800 ) ) ;
#263 = TEST ( 'Spaces must not be ignored here' ) ;

Я подумал, что регулярное выражение мне поможет, поэтому создал это (http://rubular.com/r/EtJ25Hfg77):

(\#\d+)\s*=\s*([A-Z_]+)\s*\(\s*(.*)*\s*\)\s*;

Это дает мне:

Match 1:
1: #95
2: STYLED_ITEM
3:

Match 2:
1: #12
2: CARTESIAN_POINT
3:

Match 3:
1: #263
2: TEST
3:

Итак, первые две группы работают, как предполагалось. Но мне также нужны атрибуты в скобках вроде этого:

Match 1:
1: #95
2: STYLED_ITEM
3: ''
4: (#94)
5: #92

Match 2:
1: #12
2: CARTESIAN_POINT
3: 'NONE'
4: ( 1.213489432997839200, 5.617300827691964000, -7.500000000000001800 )

Match 3:
1: #263
2: TEST
3: 'Spaces must not be ignored here'

Пожалуйста, помогите мне найти правильное выражение для последней группы (на данный момент (.*)).


person stevecross    schedule 23.04.2014    source источник


Ответы (3)


С лицензией AGPL для некоммерческого использования JSDAI - это бесплатный набор инструментов Java с открытым исходным кодом для работы с файлами STEP.

http://www.jsdai.net/

Лицензия BSD, поэтому всегда бесплатно и с открытым исходным кодом - это проект STEPcode, который генерирует C ++ и python API, а также пример чтения / записи файлов STEP, который используется другими проектами с открытым исходным кодом, такими как BRL-CAD, SCView и OpenVSP.

www.stepcode.org

OpenCasCade имеет C ++, pythonOCC имеет python, а node-occ имеет API-интерфейсы javascript для работы с данными, которые переведены из STEP, а также бесплатны и имеют открытый исходный код. OCE работает на большем количестве платформ и содержит больше исправлений ошибок.

https://github.com/tpaviot/oce

person user3015252    schedule 24.04.2014

feuerball, вы просили регулярное выражение ... Это захватывает пять групп, которые вы хотите.

Я отформатировал регулярное выражение в режиме свободного интервала, чтобы его было легче читать. Я не объяснял подробно, но каждая строка прокомментирована, и я уверен, что вы ее понимаете. :)

regexp = /(?x)   # free-spacing mode
^                # assert head of string
(\#\d+)          # captures the digits into Group 1
\s*=\s*          # gets us past the equal and spaces
([A-Z_]+)        # captures the name into Group 2
\s*\(\s*'        # gets us inside the opening quote
([^']*?)'        # captures the string in Group 3
(?:              # start optional non-capturing group, let's call it A
\s*,\s*            # get over the comma and spaces
(\([^)]*?\))       # capture parens to Group 4
(?:\s*,\s*         # start optional non-capturing group, let's call it B
([^\s)]+)            # capture last string to Group 5
)?                 # end optional non-capturing group B
)?               # end optional non-capturing group A
\s*\)\s*;        # close string
/

subject.scan(regexp) {|result|
# If the regex has capturing groups, subject is an array with the text matched by each group (but without the overall match)
# If the regex has no capturing groups, subject is a string with the overall regex match
}
person zx81    schedule 23.04.2014
comment
@feuerball Я знаю, что регулярное выражение со свободным интервалом может выглядеть огромным, но это обычное регулярное выражение с множеством комментариев. Пожалуйста, дайте мне знать, работает ли это для вас. - person zx81; 24.04.2014
comment
Извините, что не ответил. Сегодня были заняты. Я забыл упомянуть, что количество параметров варьируется, также как и тип параметра в позиции. Я думаю, мне следует пойти с библиотекой, как предлагали другие, поэтому, пожалуйста, не тратьте больше времени на регулярное выражение. В любом случае большое вам спасибо. - person stevecross; 25.04.2014

Я не думаю, что в этом случае подходят регулярные выражения. STEP - довольно распространенный формат, и для него есть парсеры. Поскольку вы используете Java, почему бы не взглянуть на это:

http://www.steptools.com/support/stdev_docs/javalib/programming.html#SEC0-5-0

Я думаю, что это тот формат, который вы используете, верно?

Если вы не примете во внимание всю схему, вы обязательно столкнетесь с проблемами с регулярными выражениями. Даже если вам удастся все учесть, вы все равно написали своего рода синтаксический анализатор. Зачем изобретать велосипед?

person Jeremy    schedule 23.04.2014
comment
Я его уже нашел, но, если я прав, это не бесплатно. Далее у меня нет доступа к файлам EXPRESS. - person stevecross; 23.04.2014