JS正则表达式错误?

时间:2015-01-17 15:30:33

标签: javascript regex match

似乎这是JS基础中的regexp中的一个错误,否则我无法解释为什么它与字符匹配

'test '.match(/^s(?:e)?|s(?:e)?|c(?:q)?|c(?:q)?$/i);
> ["s"]

为什么会这样? 这个正则表达式的意思是:如果你有一个像'se'这样的关键字,并且你想只匹配它的一部分(比如只有s或整个se),那么就写下这样的东西。

当您对关键字关系有多个关键短语时会发生重复。

2 个答案:

答案 0 :(得分:0)

你必须对所有可能的变更进行分组,否则你将陷入在部分碎片子模式之间交替的陷阱,这对于你来说不会起作用。见:

/^(?:s(?:e)?|s(?:e)?|c(?:q)?|c(?:q)?)$/i
  ^^^                               ^

如果您不需要更换,锚点或群组,请删除它们:

/se?se?cq?cq?/i

在这种情况下,听起来你刚刚构建了错误的正则表达式。在这种情况下,您将需要:

/(?:se|es|cq|qc)/i

答案 1 :(得分:0)

您的正则表达式将匹配这四个组中的一个,只有一个。

/^s(?:e)?|s(?:e)?|c(?:q)?|c(?:q)?$/i
 ^^^^^^^^ ^^^^^^^ ^^^^^^^ ^^^^^^^^

也就是说:

^s OR ^se
OR
s OR se
OR
c OR cq
OR
c$ OR cq$

其中^是字符串的开头,$是结尾。

在这种情况下,它与s完全匹配(第二个交替组中的第一种可能性)。

我不知道你真正希望它匹配什么,所以不能真正进一步建议,但这就是为什么它匹配的原因。