2013-06-04 57 views
-2

我用單引號包裝了我的第一個內容字符串,以簡化我所要求的內容。它沒有包裝在我的代碼中。爲什麼這個正則表達式在perl中不能評估爲true?

'{ 
# "ERROR" : [ 
#  "generic error message" 
# ] 
# }' =~ { 

好像因爲我只是在檢查第一個表達式爲開放式支架,但其評估爲假,這應該是真實的。

+3

咦?什麼?該代碼不完整。你的意思是正則表達式'/ {/'(它的工作原理)? – amon

+0

現在不需要perl,但可能會因爲它是元字符而逃脫它? '\ {' –

+0

@amon在perl中使用=〜運算符進行評估時,是否需要包裝正則表達式? – Rooster

回答

3

在PHP語言中,一個正則表達式只是一個普通的字符串,完整的報價:"/regex/"。另一方面,Perl具有正則表達式文字。這些直接嵌入到代碼中,但仍需要分隔符。

一般情況下,這看起來像:

$string =~ /regex/ 

的斜槓是默認的分隔符。如果斜線是一個不方便的分隔符,您可以選擇任何其他(1) - 只要在m(用於匹配)前綴正則表達式。這些比賽是等價的:

$url =~ /http:\/\///; 
$url =~ m/http:\/\///; 
$url =~ m{http://}; 

如果你想存儲預編譯的正則表達式中的變量,你可以使用qr//引號。不想這些平淡的字符串,因爲qr//正則表達式遵循相同的引用規則的正則表達式(無雙逃逸):

my $url_regex = qr~http://~; 
$url =~ $url_regex; 

=~綁定運營商試圖盡力解釋右手參數作爲一個正則表達式,所以你甚至可以使用類似php的字符串:

"123\nab12" =~ "\\d\n\\w+"; # double escaping sucks, still matches 

但是這比/\d\n\w+/差。

因此,不可能任何跳過任何分隔符:

# "=~" has higher precedence than "+". 
# Establishing precedence is the *sole* task of the parens here 
"112" =~ (1+2); # fails 
"3" =~ (1+2); # matches 
"112" =~ /1+2/; # matches 

  1. 不要使用問號正則表達式的分隔符,這些比賽只有一次。
2

試試這個:如圖所示,因爲{是不是正則表達式

'your string' =~ /\{/ 

你的語法無效。爲了解決這個問題,我將它封裝在默認的正則表達式字符中以獲得/{/,然後轉義{(導致/\{/),因爲它是正則表達式語法的元字符。 (對於正則表達式x{a,b}意味着x應至少重複a,最多b次)。

+2

其實,這不可能是問題:perl足夠聰明,可以發現'/ {/'中的'{''不是元字符。 – amon

+0

你說得對。但是,在上面的代碼中,只使用了字符'{',而不是正則表達式(例如'/ \ {/')。當我糾正語法時我逃過了'{',我正在解釋,但你說得對,它不清楚。我會澄清我的答案。 – sigpwned

相關問題