2012-11-12 195 views
3

我试图按照Documenting Regular Expressions in Groovy的示例进行操作,但无法获得我自己的示例。下面是对regex1的失败的例子,但适用于压缩regex2Groovy扩展正则表达式语法

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

这是因为你在你的正则表达式中有#个字符。

这意味着解析器忽略他们出现在每行后他们的文字,让您的分组选择和人物造型选择不正确关闭..

尝试:

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

(我打开它到美元斜线字符串,因为那么你不需要逃脱你的逃生字符(所以你得到\s\#而不是\\s\\#

+1

不知道美元slashy条GS。大! – Ayman

+0

铢,当然。谢谢,看不到树木。太棒的小提示也不错。 –

+0

@MarkFisher不用担心,花了我一会儿,看看它出错了;-) –