正则表达式与我期望它匹配的不匹配

时间:2009-08-26 11:00:44

标签: javascript regex

考虑以下Javascript正则表达式匹配操作:

"class1 MsoClass2\tmsoclass3\t MSOclass4 msoc5".match(/(^|\s)mso.*?(\s|$)/ig);

我希望它会返回[" MsoClass2\t", "\tmsoclass3\t", " MSOclass4 ", " msoc5"]。而是返回[" MsoClass2\t", " MSOclass4 "]

为什么?

5 个答案:

答案 0 :(得分:2)

msoclass3之前的制表符字符已被第一个匹配" MsoClass2\t"使用。也许您想要使用非消费的预见断言:

/(^|\s)mso[^\s]*(?=\s|$)/

答案 1 :(得分:2)

因为第一个匹配使用制表符,所以在第二个MSO字符串之前没有留下空白字符。与第二场比赛后的空间相同。

也许你想匹配单词边界而不是分隔字符。这段代码:

"class1 MsoClass2\tmsoclass3\t MSOclass4 msoc5".match(/\bmso.*?\b/ig)

会给你这个结果:

["MsoClass2","msoclass3","MSOclass4","msoc5"]

答案 2 :(得分:0)

因为一旦匹配" MsoClass2\t",匹配器就会查看m中的msoclass3,它与初始空间不匹配。

答案 3 :(得分:0)

这是因为您使用^ OR \ s(空格)进行第一次匹配,而字符串没有第3类空格。要获得所需的结果,请在match()内使用以下内容:

/mso.*?(\s|$)/ig

答案 4 :(得分:0)

我不确定你是否可以使用像(^|\s)(\s|$)这样的东西,首先 - 也许你可以,但我必须要知道正则表达式 - 而且当有人必须这样做时它永远不会好想要理解一个正则表达式:那些通常都太复杂了: - (


如果你想匹配以“mso”开头的单词,无论是大写还是小写,我可能会使用这样的东西:

"class1 MsoClass2\tmsoclass3\t MSOclass4 msoc5".match(/\s?(mso[^\s]*)\s?/ig);

哪个可以帮到你:

[" MsoClass2 ", "msoclass3 ", " MSOclass4 ", "msoc5"]

你所问的是(几乎:有几个空格差异)。

或者,甚至更简单:

"class1 MsoClass2\tmsoclass3\t MSOclass4 msoc5".match(/(mso[^\s]*)/ig);

哪个可以帮到你:

["MsoClass2", "msoclass3", "MSOclass4", "msoc5"]

没有aby空白。


更容易阅读/理解; - )