正则表达式:转义点无效

时间:2014-05-06 21:03:14

标签: regex

/\b(okay|ok|o\.k\.)\b/g

匹配o.k.

以外的所有内容
/\b(okay|ok|o\.k\..)\b/g

匹配o.k.但不是如果o.k.在字符串的末尾。我错过了什么?

5 个答案:

答案 0 :(得分:5)

\b是一个单词边界,与.后面的/\b(okay\b|ok\b|o\.k\.)/g 不匹配,正如Signus指出的那样。你想要这样的东西:

"okay dude ok o.k. yep".match(/\b(okay\b|ok\b|o\.k\.)/g)
// returns ["okay", "ok", "o.k."]

解释并链接到debuggex演示:

Regular expression visualization

Debuggex Demo

示例:

\b

请注意,在okayok之后,okayed仍位于括号内。因此,它不会匹配,例如,"he okayed the idea".match(/\b(okay\b|ok\b|o\.k\.)/g) // returns null 。例如:

{{1}}

答案 1 :(得分:4)

正如其他人正确观察到的那样,最后\b导致了您的问题。 \b仅匹配分词 - 即一侧有\w个字符,而某些GREP方言中有\W个字符(非单词字符) )在另一边。由于 在一侧已经一个非单词,这仍然与您的o.k.相匹配..但只有在紧跟一个单词字符后才会出现。

解决方案是将\b移到括号内的末尾,以便其他常规'单词(一开始就可以):

/\b(okay\b|ok\b|o\.k\.)/g

答案 2 :(得分:1)

问题是您正在应用\b这是一个单词边界,这就是o.k.在行的开头或结尾不匹配的原因。

使用以下内容时,okayoko.k.会匹配。

(okay|ok|o\.k\.)

如果您应用第一个\b字边界而不是最后一个,则可以匹配所有单词,但这仍然可以允许“notok”或“oknot”等错误匹配。

\b(okay|ok|o\.k\.)

答案 3 :(得分:1)

这就是你要找的东西:

/(\b(okay|ok)\b)|(o\.k\.)/g

http://regex101.com/r/mA5rV2#pcre

请注意\b在字边界处断言位置。

答案 4 :(得分:0)

我认为您正在寻找的是非捕捉匹配: /(?i)(okay|ok|o\.k\.)(?:\b|\s|$)/g

使用单词边界是可以的。但是,这还不够。

由于你试图在日常使用中匹配单词ok,我已经扩展了一点,让它不区分大小写,并且当它以标点符号结束时仍允许你匹配。

http://regex101.com/r/nR2sO3