2012-11-12 146 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不用擔心,花了我一會兒,看看它出錯了;-) –