0

異なる CAD システムからいくつかの STEP ファイル (ISO-10303-21) を解析する必要があり、それらは常に異なる構造になっています。表示されるフォームは次のとおりです。

#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:

したがって、最初の 2 つのグループは想定どおりに機能しています。ただし、次のような括弧内の属性も必要です。

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'

最後のグループ (現在) の正しい表現を見つけるのを手伝ってください(.*)

4

3 に答える 3

3

JSDAI は、STEP ファイルを操作するための無料でオープン ソースの Java ツールキットです。

http://www.jsdai.net/

BSD ライセンスなので、常に無料のオープン ソースは、C++ および Python API を生成する STEPcode プロジェクトと、BRL-CAD、SCView、OpenVSP などの他のオープン ソース プロジェクトで使用される STEP ファイル リーダー/ライターの例です。

www.stepcode.org

OpenCasCade には C++ があり、pythonOCC には python があり、node-occ には STEP から変換されたデータを操作するための JavaScript API があり、無料でオープン ソースでもあります。OCE はより多くのプラットフォームで動作し、より多くのバグ修正が行われています

https://github.com/tpaviot/oce

于 2014-04-24T16:04:45.300 に答える
1

feuerball、あなたは正規表現を求めました...これはあなたが望む5つのグループをキャプチャします.

読みやすくするために、正規表現をフリースペース モードでフォーマットしました。詳しくは説明しませんでしたが、一行一行にコメントがつけられており、ご理解いただけると思います。:)

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
}
于 2014-04-23T23:21:53.183 に答える
0

この場合、正規表現は適していないと思います。STEP はかなり一般的な形式であり、そのためのパーサーがあります。Java を使用しているので、これを見てみましょう:

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

これがあなたが使用しているフォーマットだと思いますよね?

スキーマ全体を考慮しない限り、正規表現で問題が発生することは間違いありません。すべてを説明できたとしても、とにかく一種のパーサーを作成しただけです。なぜ車輪を再発明するのですか?

于 2014-04-23T15:15:47.767 に答える