我试图构造一个正则表达式来捕获匹配\w{0,}?\s\d){0,}
的字符串,即一个单词后跟空格然后是数字。我嘲笑了here
只有逗号分隔的前N个匹配是组1 字符串'之后的N匹配opt',只用逗号分隔,是第2组 字符串'之后的N匹配和/或',只用逗号分隔,是第3组
我的尝试是:((\w+?\s\d),\s+(\w+?\s\d))*(\s+and/or\s+(\w+?\s\d))*(\s+opt\s+(\w+?\s\d))*
Mind 3 opt Life 3, Prime 3 and/or Death 3 #This is not matched
Life 3, Mind 3 opt Prime 3 and/or Death 3 #This is matched
Life 3, Death 3 and/or Mind 3 opt Prime 3 #this is matched
但是我确定我没有想到的边缘情况。我从根本上知道这与订单有关,我不想要。
答案 0 :(得分:2)
(?:|\s+and/or\s+|\s+opt\s+)((\w+?\s\d)(?:,\s+(\w+?\s\d))*)*
您正在寻找三种不同的方案:
String starts with nothing
或String starts with ' opt '
或String starts with ' and/or '
这与:
相同(?: # Non matching group
| # Nothing or
\s+and/or\s+| # ' and/or ' or
\s+opt\s+ # ' opt '
) # followed by
然后在每个场景中,您正在寻找以逗号分隔的一个或多个(\w+?\s\d)
。
(
(\w+?\s\d) # a word followed by a single digit
(?:,\s+ # preceeding comma and at least one space.
(\w+?\s\d))* # zero or more word-digit combinations as above,
)* # Any number of these
上述link的解释要好得多。