我需要解析如下所示的字符串: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
正则表达式默认是贪婪的,在第一次匹配时停止。要使匹配变得懒惰,您可以在搜索词后使用 ? 字符。例如,
[.+] 是贪婪的,但是 [.+?] 是懒惰的。
该网站是一个非常棒的正则表达式信息库。