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'
Пожалуйста, помогите мне найти правильное выражение для последней группы ((.*)
в данный момент).
3 ответа
С лицензией AGPL для некоммерческого использования JSDAI - это бесплатный Java-инструментарий с открытым исходным кодом для работы с файлами STEP.
Лицензия BSD, то есть всегда свободная и с открытым исходным кодом, является проектом STEPcode, который генерирует C++ и python API и пример STEP для чтения / записи файлов STEP, который используется другими проектами с открытым исходным кодом, такими как BRL-CAD, SCView и OpenVSP.
www.stepcode.org
OpenCasCade имеет C++, pythonOCC имеет python, а node-occ имеет API-интерфейсы javascript для работы с данными, переведенными из STEP, а также являются бесплатными и с открытым исходным кодом. OCE работает на нескольких платформах и имеет больше исправлений ошибок
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
}
Я не думаю, что регулярные выражения являются подходящим способом в этом случае. STEP - довольно распространенный формат, и для него есть парсеры. Поскольку вы используете Java, почему бы не взглянуть на это:
http://www.steptools.com/support/stdev_docs/javalib/programming.html
Я думаю, что это формат, который вы используете, верно?
Если вы не примете во внимание всю схему, вы неизбежно столкнетесь с проблемами с регулярными выражениями. Даже если вам удастся все учесть, вы все равно написали своего рода парсер. Зачем изобретать велосипед?