指定字符串之间交替的正则表达式?

时间:2014-06-07 03:33:12

标签: regex

  1. 给定n个任意字符串,s1,...,sn,如何指定RegEx 可以匹配所有字符串? 例如,

      

    我不聪明。

    如果我想匹配amar,我可以使用a[mr]

    但如果我想匹配amnot,我就不知道如何,因为 括号只能指定一组字符,而不能指定一组字符串。

  2. 另一个例子,我如何匹配a*b*?有没有 这个特定例子的特殊方式是什么?
  3. 感谢。

2 个答案:

答案 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

当然,这可以修改为接受标点符号或数值。

关于你的第二个问题,你暗示能够在第一个问题中使用匹配集(即括号内的字符)。要捕获任何ab字符,后跟其他任何内容:

([ab].*)

如果您希望他们后跟其他字母(可以从这里展开):

([ab][a-z]+)