考虑以下Javascript正则表达式匹配操作:
"class1 MsoClass2\tmsoclass3\t MSOclass4 msoc5".match(/(^|\s)mso.*?(\s|$)/ig);
我希望它会返回[" MsoClass2\t", "\tmsoclass3\t", " MSOclass4 ", " msoc5"]
。而是返回[" MsoClass2\t", " MSOclass4 "]
。
为什么?
答案 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空白。
更容易阅读/理解; - )