给定n个任意字符串,s1,...,sn,如何指定RegEx 可以匹配所有字符串? 例如,
我不聪明。
如果我想匹配am
和ar
,我可以使用a[mr]
。
但如果我想匹配am
和not
,我就不知道如何,因为
括号只能指定一组字符,而不能指定一组字符串。
a*
和b*
?有没有
这个特定例子的特殊方式是什么?感谢。
答案 0 :(得分:3)
您可以使用capturing or non-capturing群组将表达式与alternation operator分开。
(am|not) # group and capture to \1: 'am' OR 'not'
(?:am|not) # group, but do not capture: 'am' OR 'not'
匹配 a
或 b
,后跟*
量词含义(0
或更多次) ...
(a|b)* # group and capture to \1 (0 or more times): 'a' OR 'b'
(?:a|b)* # group, but do not capture (0 or more times): 'a' OR 'b'
或使用字符类:
([ab]*) # group and capture to \1: any character of: 'a', 'b' (0 or more times)
答案 1 :(得分:2)
如果要匹配特定和定义的单词集,可以将它们完全输入并用OR运算符|
分隔:
(am|not|smart)
等待你正在使用的语言,你需要指定不同的标志来单独捕获它们,但是“全部”它们。例如,在javascript中,您将使用g
:
str.match(/(am|not|smart)/g);
而在PHP中,您只需使用preg_match_all()
函数:
preg_match_all('/(am|not|smart)/', $str, $matches);
如果您希望匹配“所有字词”,即“任何字”,您可以使用字边界\b
:
\b([a-zA-Z]+)\b
当然,这可以修改为接受标点符号或数值。
关于你的第二个问题,你暗示能够在第一个问题中使用匹配集(即括号内的字符)。要捕获任何a
或b
字符,后跟其他任何内容:
([ab].*)
如果您希望他们有后跟其他字母(可以从这里展开):
([ab][a-z]+)