我正在尝试遵循Documenting Regular Expressions in 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)添加到字符串的开头,它也将以相同的方式失败。

在这种情况下添加扩展模式的正确语法是什么?链接站点上的示例工作正常,因此我知道应该可行。

最佳答案

这是因为您的正则表达式中包含#字符。

这意味着解析器将忽略它们出现在每一行之后的文本,因此分组选择器和字符选择器未正确关闭。

尝试:

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

(我将其切换为美元斜杠字符串,因为这样您就不必转义转义字符(因此,您将获得\s\#而不是\\s\\#)

10-08 01:56