匹配组的正则表达式,但不包括特定组的组合

时间:2016-07-21 19:57:47

标签: regex

我正在尝试匹配表达式中的两个组,每个组在首字母中表示一个字母作为名称的一部分,例如在George RR Martin中,第一个组匹配第一个R,第二个组匹配第二个R,我有这样的事情:

\b([a-zA-Z])[\.{0,1} {0,1}]{1,2}([a-zA-Z])\b

但是,我想排除这些组的特定组合,例如第一组匹配字母d而第二组匹配字母r。

这可能吗?

1 个答案:

答案 0 :(得分:1)

您可以使用否定前瞻限制匹配:

\b(?![dD]\.? ?[rR]\b)([a-zA-Z])\.? ?([a-zA-Z])\b
  ^^^^^^^^^^^^^^^^^^^ 

请参阅regex demo

注意:

  • (?![dD]\.? ?[rR]\b)前瞻应该更好地放在单词边界之后,这样检查只会在遇到单词边界时触发,而不是在字符串中的每个位置触发
  • 前瞻是否定,如果匹配中的模式与文本匹配,则匹配失败
  • 匹配:dD [dD]可选文字点\.?,可选空格 ? 1}},rR [rR]和尾字边界\b

主模式是一种更通用的模式 - \b([a-zA-Z])\.? ?([a-zA-Z])

  • \b - 领先的字边界
  • (?![dD]\.? ?[rR]\b) - 负向前瞻
  • ([a-zA-Z]) - 第1组捕获ASCII字母
  • \.? - 一个可选的点
  • ? - 可选空格
  • ([a-zA-Z]) - 第2组捕获ASCII字母
  • \b - 尾随字边界