2012-07-19 64 views
0
字符串中排除另一種模式

我的目標是匹配不圖案前包含「#」的模式,比如這個:如何匹配的模式,並在Perl

array = ("# abc", "# abcd" "abc" " abc ", "abcd" "abC# foo") 

我想匹配「abc」。 「abc」。 「A B C D」 。 「abc#foo」 我需要什麼正則表達式才能匹配只包含'#'的'abc'模式?

我試過m/[^#]+abc/g但它不起作用。

回答

0

如果你不想要#abc之前的任何地方,你幾乎在那裏。試試這個:^[^#]*abc

2

尋找正則表達式lookbehind和lookahead。

是這樣的:

m/^(?<!#).*/g 

可以工作,它的背後負的樣子。

0

這應該工作,它使用負前瞻:

^[^#]*abc(?!(.*#)) 

新的想法...

我仔細看了一遍你的問題,我發現我沒有得到你的意思是什麼。你的意圖真的很困惑,我可以肯定地說,如果字符串在同一行中有abc或abc後面的字符串,那麼你不希望獲得匹配結果(我猜你不在乎是否有其他內容或者不在他們之間)。我很困惑,因爲你明確地說你想匹配「abc#foo」,但同時你會說「只匹配'abc'不包含'#'的模式」。

如果我們要按照這個新的解釋,正確的正則表達式可能是:

(?<!(#.*))abc.* 

表達不會消耗落後ABC任何文本,將從該點匹配,如果只是任何事情之前不包含一個#。

+0

我的目標是在模式之前匹配不包含'#'的模式。 – user1539348 2012-07-20 21:07:42

+0

是的,我沒有看到......然後我在回答的第一部分回答的是好的。我的解決方案都包含反向查找功能,因此它們不會消耗與您想要包含的模式無關的文本 - 在第一種情況下爲abc,在第二種情況下爲abc。* – 2012-07-21 11:04:31

2

您的標準並不十分清楚。你想拒絕任何有#作爲第一個字符的東西嗎?

print "$_\n" for grep /^[^#]/, @array; 

會這樣做。但是,如果您還想在可能的前導空間後檢查abc那麼您需要

爲grep/^ \ s * abc /,@array打印「$ _ \ n」;

這些從您的數據產生相同的結果,並選擇你說你想要的項目。