我正在尝试遵循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
和\\#
)