[英]Regular expression does not match what I would expect it to match
考慮以下Javascript正則表達式匹配操作:
"class1 MsoClass2\tmsoclass3\t MSOclass4 msoc5".match(/(^|\s)mso.*?(\s|$)/ig);
我希望它返回[" MsoClass2\\t", "\\tmsoclass3\\t", " MSOclass4 ", " msoc5"]
。 而是返回[" MsoClass2\\t", " MSOclass4 "]
。
為什么?
第一個匹配項" MsoClass2\\t"
已經消耗了msoclass3
之前的制表符。 也許您想使用非消耗性的前瞻斷言:
/(^|\s)mso[^\s]*(?=\s|$)/
因為第一個匹配項消耗了制表符,所以第二個MSO字符串之前沒有空白字符。 與第二場比賽后的空格相同。
也許您想匹配單詞邊界而不是分隔字符。 這段代碼:
"class1 MsoClass2\tmsoclass3\t MSOclass4 msoc5".match(/\bmso.*?\b/ig)
將為您提供以下結果:
["MsoClass2","msoclass3","MSOclass4","msoc5"]
因為一旦匹配了" MsoClass2\\t"
,匹配器就會在msoclass3
中msoclass3
與初始空間不匹配的m
。
這是因為您使用^ OR \\ s(whitespace)進行首次匹配,而字符串對於類3沒有空白。要獲得所需的結果,請在match()內部使用以下內容:
/mso.*?(\s|$)/ig
我不確定您首先可以使用(^|\\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"]
Whithout的空格。
也更容易閱讀/理解;-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.