我正在尝试(以及捕获组)以下输入匹配:
favorite colors are red orange yellow
favorite colors are red orange
第一个短语有3种颜色,第二个短语有2种颜色。
我的正则表达式是:
/favorite colors are (.*) (.*) (.*)/i
但是,仅当我有3种颜色时,此正则表达式才有效。我该如何重写此正则表达式,使其也可以接受2种颜色?我尝试添加一个?到第3个捕获组的末尾,但这要求我的输入短语必须有一个尾随空格。
如果不提供第3种颜色,我不介意在捕获组中使这3种颜色为空。
根据http://stackoverflow.com/questions/12451731帖子,建议的修补程序为/favorite colors are (.*) (.*)(?: (.*))?/i
,但是它不起作用,因为它与红色橙色(第1组)和黄色(第2组)相匹配,而红色应在第2组中1,橙色应该在第2组中,黄色应该在第3组中。http://stackoverflow.com/questions/8991178帖子建议使用[^\s]
,但事实证明与末尾的点匹配。
答案 0 :(得分:0)
favorite colors are (.*) (.*) (.*)
模式在组1和组2之间以及在组2和组3之间至少需要一个空格。
此外,要仅匹配单词char,您需要使用\w
而不是.
来匹配除行换行符之外的任何char。
您可以使用带有\w+
或\w+
模式的可选非捕获组来替换.*
个模式:
/favorite colors are (\w+) (\w+)(?: (\w+))?/i
请参见this regex demo。
在这里,(?: (\w+))?
匹配可选的序列模式,空格和捕获到第3组的1个以上字符字符(字母,数字或_
)。