簡體   English   中英

忽略正則表達式匹配的空格

[英]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.

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