2014-11-03 84 views
0

如果我以錯誤的方式提問,請告訴我。不知道我是否從正確的角度接近它。無法識別兩個關鍵字

我的正則表達式看起來像這樣。

^.+(ef?)|(mn?).+$ 

我想在下面的文本匹配線2和4。

ABCD
EFGH
IJKL
MNOP
QRST

因爲它似乎,只有最後一個惹人眼球的編輯。我錯過了什麼?

我試圖按照some examples來檢測例如「ALPHA」和「BETA」的字眼,但顯然,我對它的工作方式太無知。

+2

據我所知,'^。+'表示開始時至少有1個符號。但'efgh'和'mnop'都不包含'ef'或'mn'之前的任何內容。 – Epsilon 2014-11-03 12:30:05

+0

@Epsilon實際上是。它只是不顯示。我的錯。假裝之前有一個角色(或切換爲星號而不是加號)。 :) – 2014-11-03 12:31:52

回答

2

正則表達式引擎會將下面的正則表達式分成兩部分。

^.+(ef?)|(mn?).+$ 

    Part 1| Part 2 

首先,part1將被執行。

^.+(ef?) 

.+確保必須有e之前ATLEAST單個字符存在,但不存在。所以它不符合第二個。並且因爲其餘字符串中不存在字符e而失敗。

| OR

現在正則表達式引擎移動到第二部分,

(mn?).+$ 

匹配包含字母m的字符串。 m只存在於第四個字符串中。所以它匹配m加上以下一個或多個字符,因爲.+

正確的做法,以配合2個第4串是:

^.*(ef?).*$|^.*(mn?).*$ 

OR

^.*(?:(ef?)|(mn?)).*$  

DEMO

使用^.*(?:(ef?)|(mn?)).+$,如果必須有一個字符如下e和可選的fm和opt ional n

如果要匹配的字符串以em開頭,請使用下面的正則表達式。

^(ef?|mn?).+$ 

注:

  • .*匹配任意字符零次或多次。
  • .+一次或多次匹配任何字符。
+0

太棒了。這是我一直想念的問題!雖然你的答案在技術上是正確的,但我建議一個版本顯示正確的語法。爲了避免懷疑(噢,圍繞這麼常見的事情),我正在招搖撞騙,讓別人做我的工作,我會冒昧地編輯你的答覆。如果您不滿意,請隨時糾正。 +1爲一個書呆子級別的準確性。 – 2014-11-03 12:33:39

+0

是的,是的,我做到了。你爲什麼要問? – 2014-11-03 12:47:22