2010-07-19 99 views
7

我需要匹配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,}將不起作用,因爲我不希望空白空間有助於捕獲的字符數。

回答

1

Waayy後來,但這真的需要正確的答案,併爲此原因。誰知道這個問題可能有這樣一個複雜的答案,對吧?大聲笑。但是在正則表達式中有很多關於間距的考慮因素。

首先;切勿在正則表達式中放置空格。這樣做會使您的正則表達式無法讀取,且無法維護。想起使用鼠標突出空間以確保它只有一個空間的記憶。這將打破你的正則表達式:   ,但是這不會:[   ],因爲字符類中的重複被忽略。如果你需要一個確切數量的空格,你可以在一個字符類中看到,例如:[ ]{3}。與沒有角色類的事故相比如此:    {3} < - 這實際上是尋找5個空間,woops!

秒;牢記免費寬帶(?x)選項,這使您的正則表達式可評論和可自由空間。你不應該害怕使用這個選項的人可能會破壞你的正則表達式,因爲你決定在其中放入隨機的鍵盤空間。另外,(?x)而不是忽略鍵盤空間,當它在一個字符類內像這樣:[ ]。因此,爲您的鍵盤空間使用字符類更安全。

第三;在這種情況下儘量不要使用\s。正如Omaghosh指出的,它還包括換行符(\r\n)。你提到的場景似乎並不贊成這一點。但是,正如Omaghosh指出的那樣,您可能不僅僅需要鍵盤空間。所以你可以使用[ ],[\s-[\r\n]][\f\t\v\u00A0\u2028\u2029\u0020],這取決於你喜歡什麼。這些選項中的最後兩個是相同的東西,但字符類減法只適用於.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類減法,或Non-.NET明確的空白類來代替[ ]

@"(?:\d[\s-[\r\n]]*){8,}" 
// Or . . . 
@"(?:\d[\f\t\v\u00A0\u2028\u2029\u0020]*){8,}" 
+0

優秀的答案! – 2017-09-07 13:46:21

0
(\d{8,}\s+)*\d{8,} 

應該工作

+0

測試這Expressio,它只匹配'12345678'並沒有其他的例子。 – 2010-07-19 09:50:37

+0

@Greg B:我明白你的意思了。我不確定。說實話,我不認爲這是'香草'正則表達式可能的,但我相信有一個技巧來處理它。另一個選擇是在應用正則表達式之前去除所有的空白。 – leppie 2010-07-19 09:54:29

13
(\d *){8,} 

這八個或更多出現數字,後面的零個或多個空格的匹配。將其更改爲

(*\d *){8,} #there is a space before first asterik 

在起始處用空格匹配字符串。或

(\s*\d\s*){8,} 

匹配標籤和其他空白字符(也包括換行符)。

最後,讓它成爲一個非捕獲組,?:。因此它變成(?:\s*\d\s*){8,}

+0

+1:不錯:)(填充文字) – leppie 2010-07-19 09:56:26

+1

+1'\ s * \ d \ s * {8,}'實際上是'(\ s * \ d \ s *){8,}' – TheVillageIdiot 2010-07-19 10:01:02

+0

@TheVillateIdiot修正它已經:) – Amarghosh 2010-07-19 10:06:17