4

次の正規表現を考え出したいと思います。

<action>::=Action(<entity><entity><Asset>)

次のようなトークンが必要です。

Action(
<entity>
<entity>
<Asset>
)

entity と asset は <> で囲まれ、Action の後には "(" が続きます。ただし、")" は独立したトークンです。私は以下を使用しています:

([a-zA-Z]+\\()|((<.*?>)|([a-zA-Z]*))|(\\))?

")"asトークンを表示できませんか?私は何を間違っていますか?

4

3 に答える 3

1

この正規表現を試してください:

([a-zA-Z]*\\()|(<[a-zA-Z]*>)|(\\))
于 2013-03-07T09:33:46.920 に答える
0

正規表現に実際に何か問題があるか、少なくとも式が予期しない方法で動作するようになります(私にとって)。

式は次のように分解できます。

([a-zA-Z]+\\()| (?# matches alphabetical characters and an opening round-bracket)
    ((<.*?>)| (?# non-greedily matches anything between brackets)
    ([a-zA-Z]*))| (?# 3rd pattern: may match an empty string)
(\\))? (?# 4th pattern: optionally matches a closing round bracket)

演算子は決して貪欲ではないため、|実際に必要な4番目のパターンの前に3番目のパターンがトリガーされます(空の文字列と一致します)。

これの証拠は、正規表現で実際に取得するトークンが次のとおりであることです。

''
''
''
'Action('
'<entity>'
'<entity>'
'<Asset>'
''
''

したがって、必要なのはおそらく次のようなものです。

([a-zA-Z]+\\()| (?# matches alphabetical characters and an opening round-bracket)
(<.*?>)| (?# non-greedily matches anything between brackets)
(\\)) (?# matches a closing round bracket)

?角かっこの外側に奇妙に配置され、空の文字列もキャプチャした4番目のパターンから演算子を削除したことに注意してください。

于 2013-03-07T10:55:21.647 に答える
0

これはあなたの例でうまくいくはずです:

(\\w+\\()(<\\w+?>)(<\\w+?>)(<\\w+?>)(\\))

fiddle.re オンライン デモ

于 2013-03-07T09:35:59.133 に答える