2010-08-09 83 views
3

我需要一個匹配字符串不包含兩個連續破折號的正則表達式。匹配不包含連續破折號的字符串部分

我差點與這個表達式使用環視(我看沒辦法):

([-a-z](?<!--))+ 

哪個給出以下作爲輸入:

qsdsdqf - sqdfqsdfazer - azerzaer-azerzear

主要生產三場比賽:

qsdsdqf-
sqdfqsdfazer-
azerzaer-azerzear

但是什麼我要的是:

qsdsdqf-
-sqdfqsdfazer-
-azerzaer-azerzear

所以我的正則表達式失去了第一個短跑,我不這樣做NT。

誰能給我一個提示或正則表達式,可以做到這一點?

+0

你正在使用哪種正則表達式? (PHP,.NET,Java等) – 2010-08-09 22:18:59

回答

5

這應該工作:

-?([^-]-?)* 

它確保有充分的兩個破折號之間的至少一個非連字符。

+0

因爲他問了字母串,你可以用[a-z]替換[^ - ](或\ w如果允許有下劃線,但它不會改變想法)。 – kriss 2010-08-09 22:30:58

+0

我會用'+'代替'*';就像現在一樣,在最後一次「真實」比賽之後,你總會得到一個空串的額外匹配。另外,您在一個由量詞控制的捕獲組內一次匹配一個字符;這是非常低效的。在這種情況下,我懷疑這是否重要,但這不是你想養成的習慣。至少在'[^ - ]'上加一個'+'。 – 2010-08-09 23:32:03

0

在我看來像你想要匹配包含雙連字符的字符串,但是你想把它們分解成不是的子字符串。你是否考慮過在連字符對之間進行分裂?換句話說,各執:

(?<=-)(?=-) 

至於你的正則表達式,我認爲這是你是得到什麼:

(?:[^-]+|-(?<!--)|\G-)+ 

-(?<!--)將匹配一個連字符,但如果接下來的文字也比賽結束的連字符。下一次,\G-拿起第二個連字符,因爲它是下一個字符;唯一可能發生的情況是(除了在字符串的開始處),如果之前的比賽在此時中斷了。

請注意,這個正則表達式比大多數更依賴於風味;我用Java測試了它,但並不是所有的版本都支持\G和lookbehinds。