2013-07-26 23 views
7

考慮下面的正則表達式:在正則表達式的中間插入插入符號或美元符號是否合理?

/xyz^abc/ 
/xyz$abc/ 

什麼將這些比賽?

我知道

  • 插入符號(^),當在正則表達式的開始使用,行的開頭匹配
  • 當在一個結束時使用美元符號($)正則表達式,匹配線的端
  • 插入符號(^),作爲一個字符類的第一個字符使用時,否定了類

我相信給定的正則表達式不會匹配任何東西,但我不確定。

+2

我認爲這取決於正則表達式的風格。它們可以匹配文字等價物('^'和'$'作爲文字字符)。 –

+0

@DanielHaley:難道他們不得不爲逃避而發生?有沒有一種正則表達式可以讓一個非轉義的'^'匹配一個字面的'^'? – RichieHindle

+0

@RichieHindle - 他們在GVIM中非正式工作。還沒有嘗試過其他任何東西。我認爲大多數口味都需要逃避。 –

回答

6

根據選項,一個^或正則表達式中間的$可以導致匹配:

>>> if re.search(r'xyz.^abc', "xyz\nabc", re.MULTILINE | re.DOTALL): 
... print "Matched" 
... 
Matched 

MULTILINE使得^匹配行的開始,即使行不在字符串的開頭。 DOTALL使.匹配換行符。

(我不能找到一種方法,讓你確切的例子匹配任何內容。)

4

那些不會匹配任何東西。但是:

/(xyz$|^xyz)/ 

這將匹配任何以xyz開頭或以xyz結尾的行。

更新:

安迪摹指出,多行模式可以找到適合你的正則表達式的字符串匹配。但是這隻適用於如果實現被配置爲支持中間字符串錨匹配。

這是Regular-Expressions.info(我最喜歡的地方學習&理解正則表達式):

如果您有由多行字符串,如第一 行\ n行(其中\ n表示線break),通常 需要使用行而不是整個字符串。 因此,本教程中討論的所有正則表達式引擎都有 選項來擴展兩個錨點的含義。 ^然後可以匹配字符串的起始 (在上述字符串中的f之前)以及每個換行符後(在\ n和s之間)的 。同樣,$在字符串末尾(在最後一個e之後)以及在每個 換行符之前(在e和\ n之間)都將匹配 。

在文本編輯器一樣的EditPad Pro或GNU Emacs的,和正則表達式的工具,如 PowerGREP,插入符號和美元始終與在開始和 每一行結束。這是有道理的,因爲這些應用程序設計爲 使用整個文件,而不是短字符串。

在本網站討論的所有編程語言和庫, 除了Ruby之外,您必須明確激活此擴展的 功能。傳統上稱之爲「多線模式」。在Perl中, 可以通過在正則表達式代碼之後添加m來實現,如下所示: m/^ regex $/m ;.在.NET中,當您指定RegexOptions.Multiline時,錨點在換行符 之前和之後匹配,例如 正則表達式。匹配(「字符串」,「正則表達式」,RegexOptions.Multiline)。

+0

+1正是我想到的例子。 –

+0

原始可能工作在多線模式。 –

+0

@AndyG - 好點,我相應地更新了我的答案。 –

0

在Perl,$也用於字符串變量插值到正則表達式:

my $abc = 'pqr'; 
my $result = ('xyzpqr' =~ /xyz$abc/); # $result is now true 
相關問題