簡體   English   中英

正則表達式與我期望的不匹配

[英]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" ,匹配器就會在msoclass3msoclass3與初始空間不匹配的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM