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 回答