2011-10-11 52 views
2

我想寫一個不會匹配一定數量的空格的正則表達式,但它不會像我預期的那樣。如何編寫不匹配一定數量的空白的正則表達式?

我有這些字符串:

^(123|321)[^\ ]{6}.* 

這不:

123  99999 # has 6 white spaces 
321  99999 # same 
123 8888 # has 3 white spaces \ 
321 8888 # same    | - These are the lines I 
1237777        | want to match 
3217777       /

我想最後四行匹配,即以123或321,然後什麼,但6個空白字符開始似乎在伎倆 - 這隻匹配最後兩個。我錯過了什麼?

回答

1

試試這個:

^(123|321)(?!\s{6}).* 

(使用負前瞻所以看看是否有.*匹配6個空格)

+0

不符合具有7個或更多尾隨空格的123。 – Donut

+0

@Donut - 我想我們可以放心地假設它是6或更多。 – manojlds

+0

@manojlds是的,你做。謝謝。 – filippo

1

什麼語言,你在做這個?如果在Perl或一些支持PCREs,你可以簡單地使用負前向斷言:

^(123)|(321)(?!\ {6}).* 
2
" 888" 

如果匹配這個了,這不符合[^\ ]{6}:這是說

[not a space][not a space][not a space][not a space][not a space][not a space] 

在這種情況下,你有問題,前3個字符是空格,所以它不正確匹配。

您可以使用負向預覽^(123)|(321)(?!\s{6})。我比較喜歡的是因爲它更具可讀性,所以寫出正則表達式來匹配你不想要的東西,然後否定(即,not,!等)。我對數據不夠了解,但我會使用\s{6},然後否定它。

0

你需要首先說,它可以具有3個空格,然後拒絕三個空格的存在,這樣的:

^([0-9]+)(\s{0,3})([^ ]{3})([0-9]*)$ 

^([0-9] +)=接受一個或多個數字在你的字符串的開頭。

(\ s {0,3})=接受零或最多三個空格。

([^] {3})=不允許接受允許的空格後面的3個空格。

([0-9] *)=接受空格後的任意數字,直到字符串結束。

或者:

^([0-9]+)(\s{0,3})(?!\s+)([0-9]*)$ 

這裏唯一的變化是,這三個容許空間後,它不會接受任何更多的空間(我特別喜歡這個第二個選項更多,因爲它更可讀)。

希望它有幫助。

相關問題