[英]Ignoring white space for a Regex match
我需要匹配8位或更多位數,其序列可以包含空格。
例如,以下所有內容都是有效的匹配。
12345678
1 2345678
12 3 45678
1234 5678
12 34567 8
1 2 3 4 5 6 7 8
目前我有\\d{8,}
但這只會捕獲一個8位或更多位的實體塊。
[\\d\\s]{8,}
將無法正常工作,因為我不希望空格占用捕獲的字符數。
(\d *){8,}
它匹配八個或更多個數字后跟零個或多個空格。 將其更改為
( *\d *){8,} #there is a space before first asterik
在開頭匹配字符串與空格。 要么
(\s*\d\s*){8,}
匹配制表符和其他空格字符(也包括換行符)。
最后,使用?:
將其設為非捕獲組。 因此它變成了(?:\\s*\\d\\s*){8,}
Waayy后來,但這確實需要正確的答案,這是一個原因。 誰知道這個問題會有這么復雜的答案,對吧? 大聲笑。 但是在正則表達式中有很多關於間距的考慮因素。
首先; 永遠不要在正則表達式中放置空格。 這樣做會使你的正則表達不可讀,並且不可維護。 記住使用鼠標突出顯示空間以確保它只有一個空間的記憶。 這會破壞你的正則表達式:但是這不會:[],因為忽略了字符類中的重復。 如果你需要確切數量的空格,你可以在類似的字符類中看到它: [ ]{3}
。 與沒有角色類的事故一樣:{3} < - 這實際上是尋找5個空間,woops!
第二; 記住Freespacing (?x)
選項,這使得你的正則表達式可以評論和自由空間。 您不應該擔心使用該選項的人可能會破壞您的正則表達式,因為您決定在其中放置隨機鍵盤空間。 此外, (?x)
當它在如下所示的字符類中時不會忽略鍵盤空間: [ ]
。 因此,為鍵盤空間使用字符類更安全。
第三; 盡量不要在這種情況下使用\\s
。 正如Omaghosh指出的那樣,它還包括換行符( \\r
和\\n
)。 你提到的場景似乎不太喜歡。 然而,正如Omaghosh指出的那樣,你可能想要的不僅僅是鍵盤空間。 因此,您可以使用[ ]
, [\\s-[\\r\\n]]
或[\\f\\t\\v\ \
\
\ ]
具體取決於您的喜好。 這些選項中的最后兩個是相同的,但字符類減法只適用於.NET和其他一些奇怪的風格。
第四; 這是一種常見的過度構建模式: (\\s*...\\s*)*
。 它沒有任何意義。 它與此相同: (\\s*\\s*...)*
或者這個: (\\s*\\s*\\s*\\s*...)*
。 因為模式是重復的。 反對我所說的唯一論據是,你可以保證在...
之前捕獲空格。 但不是一次真正想要的。 在最壞情況下,您可能會看到: \\s*(...\\s*)*
Omaghosh得到了最接近的答案,但這是最短的正確答案:
Regex.Match(input, @"(?:\d[ ]*){8,}").Groups[0].Value;
或者下面,如果我們從字面上理解六個選項在多行上的相同文本中:
Regex.Match(input, @"(?m)^(?:\d[ ]*){8,}$").Groups[0].Value;
或者以下,如果它是更大的正則表達式的一部分並且需要一個組:
Regex.Match(input, @"...((?:\d[ ]*){8,})...").Groups[1].Value;
並隨意用.NET類減法或非.NET顯式空白類替換[ ]
:
@"(?:\d[\s-[\r\n]]*){8,}"
// Or . . .
@"(?:\d[\f\t\v\u00A0\u2028\u2029\u0020]*){8,}"
(\d{8,}\s+)*\d{8,}
應該管用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.