2017-08-24 70 views
2

我正在嘗試開發一個正則表達式,它在連字符的第一個實例之前拉出前幾個字符,然後在第一個連字符後保存第二組元素。排除第一個連字符後的連字符

這裏的正則表達式:

^([^-]*)(?(?=-)(\S.*)|()) 

而且這裏有幾個測試案例:

SSB x Dj Chad - Crazy Beat - Tarraxo 
Dj [R]afaa [F]ox -Tarraxo Do Inicio Das Aulas (Nova Escola Producões) 
Dj Snakes Share - MaloncyBeatz - Perfecto 
Tarraxo Das Brasileiras [2014] [TxiGa Pro] 

IF語句處理最後一個條件很好,但我的問題是,在最初的幾個項目,則返回第二組使用連字符而不是排除它。

換句話說: Dj Snakes Share - MaloncyBeatz - Perfecto應該返回:

  • 組1:Dj Snakes Share
  • 組2:MaloncyBeatz - Perfecto

相反,第2組爲:- MaloncyBeatz - Perfecto

更新

https://regex101.com/r/2BQPNg/12

使用^([^-]*)[^-]\W*(.*),它的工作原理,但它提出的最後一種情況下(在沒有連字符)的問題。它不包括]

+0

好像它是您的測試鏈接,現在的工作。 – tima

+0

@tima最後一種情況現在排除字符串 – Adib

回答

3

我的解決辦法:

^([^-]+?)\s*(?:-\s*(.*))?$

^   // start of line 
([^-]+?) // 1+ not '-' chars, lazily matched (first captured group) 
\s*  // 0+ white-space chars 
(?:  // grouped, not captured 
-   // dash 
\s*(.*) // 0+ white-space chars then anything (second captured group) 
)?  // 0 or 1 time 
$   // end of line 

標誌:全球多線

Demo

501步減少到164步:

^[^-]+$|^((?:\w[^-]*)?\w)\W+(\w.*)

^    # start of line 
[^-]+   # 1 or more not '-' 
$    # end of line 
|    # OR 
^    # start of line 
(    # start of group (captured) 
(?:    # start of group (not captured) 
\w[^-]*   # a word char then 0 or more not '-' 
)?    # 0 or 1 times 
\w)    # a word char, then end of group 
\W+    # 1 or more non-word chars 
(\w.*)   # a word char then 0 or more anything (captured) 

Demo

+0

這滿足所有條件!謝謝! – Adib

+0

隨着數據增長,這將非常緩慢。 [目前](https://regex101.com/r/GEEgEp/3)與[我的正則表達式](https://regex101.com/r/2BQPNg/15)相比,它需要595個步驟,需要76個步驟。 – anubhava

+0

@anubhava只是[刪除懶惰匹配](https://regex101.com/r/GEEgEp/4),這個答案是在你的前面16步! –

1

您正在使用此正則表達式:

^([^-]*)[^-]\W*(.*) 

在這裏,你在你的正則表達式,是造成第一組匹配一個字符不到比賽的額外[^-]

你可以使用這個表達式:

^([^-]*)(?:\s+-\s*(.*))?$ 

RegEx Demo

+0

末尾的']',我基本上不用[^ - ],最好是簡單地使用\ W *來捕獲所有非字母字符。到目前爲止,我沒有任何問題,但你的正則表達式如何處理這種情況:'Dj蛇分享 - [MaloncyBeatz] - Perfecto' – Adib

+1

好吧,現在檢查我的更新答案。 – anubhava

相關問題