第一次实例后排除连字符

时间:2017-08-24 20:14:18

标签: regex

我试图开发一个正则表达式,它在连字符的第一个实例之前拉出前几个字符,然后在第一个连字符后保存第二组元素。

这是正则表达式:

^([^-]*)(?(?=-)(\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*(.*),它可以工作,但它为最后一种情况(没有连字符)提出了问题。它排除了]

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您正在使用此正则表达式:

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

在这里,你的正则表达式中有一个额外的[^-],导致第一个组匹配一个小于匹配的字符。

您可以使用此正则表达式:

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

RegEx Demo