2013-06-12 60 views
3

我在繞過正則表達式時遇到問題。排除正則表達式中的某個雙字符

到目前爲止,我的模式是這樣的(Python的放牧,味正則表達式)

(?P<text> 
[a-zA-Z0-9]+  # can start with "core char" 
[a-zA-Z0-9\ \-]*  # can have a "core char" or space|dash within it 
[a-zA-Z0-9]+  # must end with a "core character" 
) 

我想內,使得中段改變這一點,我不匹配上有重複的空間或破折號。文本中有多個空格/破折號是可以接受的。

好:

hello world 
hello-world 
h-ll-w-rld 

不好:

-hello-world 
hello--world 
h-ll--w-rld 
hello world 
+1

一個簡單的方法可能是剛添加第二個正則表達式來重新測試通過第一個正則表達式的字符串的雙倍空間/短劃線。它不是非常高效,但寫起來簡單快捷。 –

+2

難道你不能只是從中間部分刪除'*',是hello-wo-rld可以接受嗎? –

+0

@ Dgrin91建議的速度損失可能會很小,同時讓您的代碼更具可讀性,模塊化且易於維護。 – ajp15243

回答

2

您可以像下面這樣:

^([a-zA-Z0-9]+[\ \-]?)*[a-zA-Z0-9]+$ 

http://rubular.com/r/VGfGTrqayR


如果你總是希望有2分或更多的話,比你使用以下代替

^([a-zA-Z0-9]+[\ \-])+[a-zA-Z0-9]+$ 

http://rubular.com/r/EdV3iBQbsw

+0

我認爲這是主意,他確實希望像這樣的工作。也許更好的例子就是這樣的東西。 –

+0

這不會匹配「h」 – ctn

+0

@ctn好的,我固定了那部分。雖然我不完全確定OP要匹配'h' –

6

試試這個:

(?P<text> 
[a-zA-Z0-9]+ 
([ -][a-zA-Z0-9]+)* 
) 
+0

helloWorld適合我 – ctn

+1

哦,對,*允許爲0.在這種情況下,不要介意,我錯了。 –

+0

這匹配'0'和'h'。只有'h'應該匹配。 sooo關閉。 –