2013-05-28 36 views
1

我想匹配一個子字符串與正則表達式,但^改變了邏輯,因爲我沒有想到。 正則表達式...^在正則表達式中造成一些麻煩

 ^(?!My Words).*$ 

拒絕與My Words開始的句子。在這種情況下,負面預測檢查整個單詞。 但是,如果我把^然後

(?!My Words).*$ 

正則表達式正好包含My Words lskjdf句子返回y Words lskjdf。爲什麼在這種情況下,負向預測不會被整體考慮?爲什麼它只會挑選M進行比賽? ^(?1如何共同工作?

+0

這是什麼語言? – christopher

+0

我正在使用.net正則表達式引擎這個鏈接,我正在使用測試.. http://www.regexplanet.com/advanced/dotnet/index.html –

+0

你期望'^'做什麼? – JJJ

回答

2
^(?!My Words).*$ 

^(?!手段尋找一個字符串的開頭,或符合多標誌,它後面沒有......

這就是爲什麼你必須先從「我的話」任何句子做在使用^錨點時不匹配。

之所以y Words取出^錨時,匹配的是,現在你只是尋找字符串中的任何一點,後面沒有My Words,這M後的位置相匹配。

讓我們看看字符串My Words以及(?!My Words).*$如何應用於它。

請記住,^是字符串的開始,即使你沒有把它放在你的正則表達式中,正則表達式引擎仍然會在那個位置開始。我會簡化它的一些工作原理。

首先正則表達式引擎步:

^My Words 
| 
Regex engine starts here, and looks if the current position onwards 
matches (?!My Words), which it does not. 

第二步:

^My Words 
| 
Regex engine evaluates the 'M', and finds that from this position 
onwards also fails to match (?!My Words) 

第三步:

^My Words 
    | 
    Standing at 'y', it finds that the lookahead now does not match 'My Words'. 
    This allows the rest of the pattern '.*$' to be applied, which matches 
    from 'y' till end of string. 
+0

嗨。 。@Melwil ..美好的一天!!我期望負面的lookahead能夠作爲一個單位工作.. –

+0

YOu再次閱讀我的問題..你不明白我問我想什麼.. –

+0

好吧...現在我去.. :) –

1

這是因爲^你正在使強制匹配從開始的字符串。

沒有^它將匹配任何地方字符串之間,所以它會匹配y Words lskjdf

+0

嗨.. @Anirudh ..謝謝..我期望負面lookahead檢查整個字符串裏面lookahead ..我期望這就像它寫的那樣工作...... –

+1

@SpiralsWhirls正如我用'^'所說的,你明確地**標記**字符串的開始和結束。如果沒有'^',正則表達式可以自由匹配任何地方,比如'我的話!= y Words!= Words!= Words!= ords!= rds ...' – Anirudha

+0

ok ..並且絕對是'My Words!= y Words' ..我明白了。 –