考慮下面的正則表達式:在正則表達式的中間插入插入符號或美元符號是否合理?
/xyz^abc/
/xyz$abc/
什麼將這些比賽?
我知道
- 插入符號(
^
),當在正則表達式的開始使用,行的開頭匹配 - 當在一個結束時使用美元符號(
$
)正則表達式,匹配線的端 - 插入符號(
^
),作爲一個字符類的第一個字符使用時,否定了類
我相信給定的正則表達式不會匹配任何東西,但我不確定。
考慮下面的正則表達式:在正則表達式的中間插入插入符號或美元符號是否合理?
/xyz^abc/
/xyz$abc/
什麼將這些比賽?
我知道
^
),當在正則表達式的開始使用,行的開頭匹配$
)正則表達式,匹配線的端^
),作爲一個字符類的第一個字符使用時,否定了類我相信給定的正則表達式不會匹配任何東西,但我不確定。
根據選項,一個^
或正則表達式中間的$
可以導致匹配:
>>> if re.search(r'xyz.^abc', "xyz\nabc", re.MULTILINE | re.DOTALL):
... print "Matched"
...
Matched
MULTILINE
使得^
匹配行的開始,即使行不在字符串的開頭。 DOTALL
使.
匹配換行符。
(我不能找到一種方法,讓你確切的例子匹配任何內容。)
那些不會匹配任何東西。但是:
/(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)。
+1正是我想到的例子。 –
原始可能工作在多線模式。 –
@AndyG - 好點,我相應地更新了我的答案。 –
在Perl,$
也用於字符串變量插值到正則表達式:
my $abc = 'pqr';
my $result = ('xyzpqr' =~ /xyz$abc/); # $result is now true
我認爲這取決於正則表達式的風格。它們可以匹配文字等價物('^'和'$'作爲文字字符)。 –
@DanielHaley:難道他們不得不爲逃避而發生?有沒有一種正則表達式可以讓一個非轉義的'^'匹配一個字面的'^'? – RichieHindle
@RichieHindle - 他們在GVIM中非正式工作。還沒有嘗試過其他任何東西。我認爲大多數口味都需要逃避。 –