2014-11-03 74 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