3

Groovy での正規表現の文書化の例に従おうとしていますが、自分の例を機能させることができません。regex1 では失敗するが、圧縮された regex2 では機能する例を次に示します。

def line = "some.key=a value # with comment that is ignored"
def regex1 = '''(?x)        # enable extended patterns
               ^\\s*        # ignore starting whitespace
               ([^=#]+)     # capture key
               =            # literal
               ([^#]*)      # capture value'''
def regex2 = '''^\\s*([^=#]+)=([^#]*)'''
def pattern = ~regex1
def matcher = pattern.matcher(line)
for (i=0; i < matcher.getCount(); i++) {
    println matcher[i][0]
    println matcher[i][1]
    println matcher[i][2]
}

私が得ているエラーは

Caught: java.util.regex.PatternSyntaxException: Unclosed character class near index 217`

これは、最後の一致の最後の閉じブレースを指します。

regex2 を変更(?x)して文字列の先頭に追加すると、同じように失敗します。

この場合、拡張パターンを追加するための正しい構文は何ですか? リンクされたサイトの例はうまく機能するので、それが可能であることはわかっています。

4

1 に答える 1

4

#正規表現にキャラクターが含まれているためです。

これは、パーサーが発生する各行のテキストを無視しているため、グループ化セレクターと文字セレクターが適切に閉じられていないことを意味します。

試す:

def regex1 = $/(?x)        # enable extended patterns
               ^\s*        # ignore starting whitespace
               ([^=\#]+)   # capture key
               =           # literal
               ([^\#]*)    # capture value/$

(私はそれをドルスラッシュ文字列に切り替えました。エスケープ文字をエスケープする必要がないためです(したがって、\sand\#ではなく\\sandを取得します\\#

于 2012-11-12T10:33:22.473 に答える