RegEx 在我想要之前匹配字符

RegEx 在我想要之前匹配字符

我需要解析如下所示的字符串:A Christmas Special - Special of the day根据-字符是否存在于原始字符串中,将其解析为 3 或 4 个不同的组,如下所示:

(圣诞特辑)(-)(特别)(当天的)如果出现 - 字符。

或者

(圣诞特辑)(特别节目)(当天的)如果没有 - 字符。

我尝试在字符串上使用的 RegEx 模式如下所示:^(.+?)( - )?(Special)(.*)

翻译过来就是:

Group1 = 匹配任意字符(换行符除外) 一次至无限次,尽可能少的次数,根据需要扩展 [懒惰]

Group2 =-逐字匹配。在零到一次之间,尽可能多次,根据需要返回 [贪婪]

Special第 3 组:逐字匹配字符

Group4:匹配任意字符(换行符除外)零次至无限次之间,尽可能多次,根据需要返回[贪婪]

现在表达式的问题是由于字符-是可选的,所以第一次出现的单词Special会被视为属于不同的组,而不是我希望它成为其中一部分,所以得到的组看起来像这样。

(圣诞节)(特别)(- 当天的特别活动)如果出现 - 字符。

或者

(圣诞节)(特别)(当天特别)如果没有 - 字符。

它与我尝试从字符串中获取的分组模式都不匹配,所以问题很明显。

我如何改变正则表达式模式,使其不将第一次出现的 Special 单词视为它自己唯一的组,而是使第二次出现的单词变得唯一,这样我就可以得到我期望的分组?

答案1

尝试一下这个:

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

([^-]+[^-\s]):匹配任何不包含“-”且不以空格结尾的字符串。

\s?( - )?:匹配空格或“-”

(Special)\s?(.*):匹配“特殊 +空格(可选)+ any_string'

答案2

正则表达式默认是贪婪的,在第一次匹配时停止。要使匹配变得懒惰,您可以在搜索词后使用 ? 字符。例如,

[.+] 是贪婪的,但是 [.+?] 是懒惰的。

该网站是一个非常棒的正则表达式信息库。

http://www.regular-expressions.info/

相关内容