我试图开发一个正则表达式,它在连字符的第一个实例之前拉出前几个字符,然后在第一个连字符后保存第二组元素。
这是正则表达式:
^([^-]*)(?(?=-)(\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
应该返回:
Dj Snakes Share
MaloncyBeatz - Perfecto
相反,第2组是:- MaloncyBeatz - Perfecto
更新
https://regex101.com/r/2BQPNg/12
使用^([^-]*)[^-]\W*(.*)
,它可以工作,但它为最后一种情况(没有连字符)提出了问题。它排除了]
。
答案 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
标志:全局,多行
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)
答案 1 :(得分:1)
您正在使用此正则表达式:
^([^-]*)[^-]\W*(.*)
在这里,你的正则表达式中有一个额外的[^-]
,导致第一个组匹配一个小于匹配的字符。
您可以使用此正则表达式:
^([^-]*)(?:\s+-\s*(.*))?$