2009-11-01 32 views
0

當我學習正則表達式時,我知道它們應該以斜槓字符開頭和結尾(後面跟着修飾符)。正則表達式打開和關閉字符

例如/狗/我

然而,在許多例子中我看到他們開始與其他字符,如@,#,和結束|。

例如|狗|

有什麼區別?

回答

4

一些RE引擎將允許您使用不同的字符,以避免在RE中使用時需要轉義這些字符。

例如,對於sed,可以使用任一的:

sed 's/\/path\/to\/directory/xx/g' 
sed 's?/path/to/directory?xx?g' 

後者往往是更具有可讀性。前者有時被稱爲「傾斜牙籤」。用Perl,您可以使用的:

$x =~ /#!\/usr\/bin\/perl/; 
$x =~ m!#\!/usr/bin/perl!; 

但我還是主張後者則是對眼睛更容易,尤其是在RE的獲得非常複雜。那麼,就像任何 Perl代碼一樣容易:-)

5

這從一個正則表達式味道差異巨大到下一個。例如,JavaScript只允許使用正斜槓(或solidus)作爲正則表達式文本的分隔符,但在Perl中,您可以使用任何標點符號 - 包括更新版本中的非ASCII字符,如«»。當您使用進來的平衡雙象大括號,括號,或者上面的雙箭頭引號字符,他們必須保持良好的平衡:

m«\d+» 
s{foo}{bar} 

紅寶石,您還可以選擇不同的分隔符,如果你使用%r前綴,但我不知道這是否延伸到平衡分隔符或非ASCII字符。許多語言根本不支持正則表達式文字;您只需將正則表達式寫爲字符串文字,例如:

r'\d+' // Python 
@"\d+" // C# 
"\\d+" // Java 

請注意Java版本中的雙反斜槓。這是必要的,因爲字符串得到了兩次處理:一次由Java編譯器處理,一次由Pattern類的compile()方法處理。大多數其他語言提供了字符串文字的「原始」或「逐字」形式,這些形式幾乎消除了這種反斜槓。

然後就是PHP。它的preg正則表達式函數建立在PCRE庫之上,它嚴格模仿Perl的正則表達式,包括各種各樣的分隔符。然而,PHP本身不支持正則表達式文字,所以你必須給他們寫,好像他們是嵌入在字符串中的正則表達式文字,就像這樣:

'/\d+/g' // match modifiers go after the slash but inside the quotes 
"{\\d+}" // double-quotes may or may not require double backslashes 

最後請注意,即使是那些做語言都支持正則表達式的文字通常不會提供像Perl的s/…/…/構造。最接近的是一個函數調用,它將第一個參數取爲正則表達式,將第二個字符串取爲字符串,如下所示:

s = s.replace(/foo/i, 'bar') // JavaScript 
s.gsub!(/foo/i, "bar")  // Ruby 
相關問題