2016-10-09 34 views
0

我的正則表達式到目前爲止是:正則表達式從第二個捕獲組中排除,如果符合一定的標準

^(UCX_|UBX_|USP_)([A-Za-z0-9]\w+)(_\d+)?$ 

當我測試的字符串:

UCX_1maxi_holiday2_blah_343 

它正確地測試真實可是我最後的拍攝組會永遠不會被達到,因爲它也匹配第二組。 即,如果最後一個下劃線劃定的部分是我希望第三個捕獲組中的那個部分不是第二個的所有數字。否則我想在第二組中使用它。

我想向前看符號和-behinds的,我不認爲他們會爲這個工作,但我會感到驚訝。

我可以做一個單獨的測試來檢查單獨的字符串的結尾,然後根據需要拆分字符串,但是知道好奇心。

我不知道是否有一種方法修改第二捕獲組從重挫結束時,如果它的所有數字

任何人都得到了一些正則表達式柔術這個停止嗎?

回答

1

如果您將第二次捕獲更改爲非貪婪,您將得到您想要的。 用途:

^(UCX_|UBX_|USP_)([A-Za-z0-9]\w+?)(_\d+)?$ 
+0

這是有效的。我最初對nongreedy的理解需要一些教育。那麼如果知道下一個模式會採用它,那麼非貪婪就會通過吃東西? – jollarvia

+0

一般來說,是的。貪婪的表達通常會更快,因爲非貪婪的匹配需要向前看或回溯(以便「知道」爲模式的下一部分留下什麼);在很多情況下,速度差異永不重要。 – cco

0

可以簡化這樣做:

^(UCX_|UBX_|USP_)(\w+?)(_\d+)?$ 

\w字符是A-Z,A-Z,0-9,包括_ (下劃線)字符的字符。

+0

感謝馬塞爾,但這將需要在最後的數字組,我試圖使它可選 – jollarvia

+0

我明白了,@jollarvia。我更新了答案。 –

+0

另一個正則表達式變體:[(^(U(?:[BC] X | SP)_)((?!_)\ w +?)(_ \ d +)?$'](https://regex101.com/ r/EdF7X2/1) –

相關問題