2013-01-05 73 views
2

如何在使用匹配約束時逃避正則表達式中的正斜槓?這是我的嘗試:如何在匹配約束中逃避正斜槓

constraints { 
    url (
     matches: "^http://www.google.com/$" 
    ) 
} 

錯誤:solution: either escape a literal dollar sign "\$5" or bracket the value expression "${5}"

constraints { 
    url (
     matches: "^http:\/\/www.google.com\/$" 
    ) 
} 

錯誤:unexpected char: '\'

回答

7

在用雙引號定義的字符串("..")常規替代變量與$

def var = "world" 
def str = "hello $var" // "hello world" 

在您的驗證正則表達式中,這是導致錯誤。您希望將$用於正則表達式,而不是用於變量替換。爲了避免變量替換,你可以定義在單引號('..'

def str = 'hello $var' // "hello $var" 

字符串你不需要定義字符串中的正則表達式時逃跑/,但你應該逃脫.。在正則表達式.中匹配任何字符。所以正則表達式^http://www.google.com/$匹配http://wwwAgoogleB.com/

爲了逃避你必須使用\\一個字符串中的字符(第一\是逃避第二\)。所以下面的表達式應該工作:

static constraints = { 
    name (
     matches: '^http://www\\.google\\.com/$' 
    ) 
} 

通常情況下,你也可以使用Groovy的正則表達式語法(/../)。這這種情況下,正則表達式應該是這樣

~/^http:\/\/www\.google\.com\/$/ 

你不需要轉義,但因此,你必須逃脫斜線(因爲它們用於終止正則表達式)雙反斜線。但據我所知,這個語法不適用於來自grails的匹配約束。

+3

+1。 「slashy-string」語法可以工作,但不需要前導'〜'。在groovy中'/ foo /'只是字符串文字的替代語法。 '〜'運算符可以在任何字符串(單引號,雙引號或斜槓)前作爲'Pattern.compile'的簡寫來將字符串轉換爲'Pattern'。 –