从正则表达式中排除单词和引号

Exclude word and quotes from regexp

我有以下短语:

  1. “史密斯”先生
  2. “史密斯”先生

我只需要从这些短语中检索 Smith。我尝试了数千种变体。我停在 (?!Mr|MrS)([^"]+)。 请帮忙。

模式 (?!Mr|MrS)([^"]+) 从当前位置断言直接在右边的不是 Mr 或 MrS,然后捕获除 "

之外的任何字符的 1+ 次出现

所以它不会在 Mr 开始匹配,但会在 r 开始,因为在 r 之前的位置,前瞻断言为真。


您可以匹配 Mr 或 MrsS 并捕获双引号之间的内容,而不是使用环视。

\mMrS? "([^"]+)"
  • \m一个单词边界
  • MrS?Mr 与可选的 S
  • 匹配
  • "匹配一个space和"
  • ([^"]+) 在组 1 中捕获 "
  • 之间的内容
  • " 匹配 "

看到一个postgresql demo

例如

select REGEXP_MATCHES('Mr "Smith"', '\mMrS? "([^"]+)"');
select REGEXP_MATCHES('MrS "Smith"', '\mMrS? "([^"]+)"');

输出

    regexp_matches
1   Smith

    regexp_matches
1   Smith