Regex 如何识别句子中不同前缀后最多两个世界

Regex 如何识别句子中不同前缀后最多两个世界,regex,regex-group,Regex,Regex Group,我知道这不是一个新问题,但我需要做一些预处理,并用REGEX生成一个模式,在一些前缀后面替换/查找名字/姓氏,例如亲爱的John doe,,亲爱的John D,你好约翰,你好约翰先生,你好约翰,等等 假设每个句子中有1到2个单词(first name/first+last),可以在名称末尾包含逗号,但不必包含逗号 例如: Hi Mr John, we are planning to go out 或 应分别修改: Hi Mr @name, we are planning to go out

我知道这不是一个新问题,但我需要做一些预处理,并用REGEX生成一个模式,在一些前缀后面替换/查找名字/姓氏,例如
亲爱的John doe,
亲爱的John D
你好约翰
你好约翰先生
你好约翰
,等等

假设每个句子中有1到2个单词(first name/first+last),可以在名称末尾包含逗号,但不必包含逗号

例如:

Hi Mr John, we are planning to go out

应分别修改:

Hi Mr @name, we are planning to go out

到目前为止我已经试过了,但它不是正确的解决方案,它可以做得更好

((?i)Mr's|(?i)Mr|(?i)Hi|(?i)Dear)(/(\w+\s){1,}\w+[.?!]/)
关于

您似乎可以使用

\b((?:\s*(?i:Mr(?:'s)?|Dear|Hi(?!,?\s*Mrs?\b)))+)\s+[A-Z]\w*(?:[\s-]+[A-Z]\w*)?
替换如下:

$1 @name

详细信息

  • \b
    -单词边界
  • ((?:\s*(?i:Mr(?:'s)|亲爱的|嗨(?,?\s*Mrs?\b))+
    -第1组(称为替换模式中的
    $1
    \1
    ),匹配以下模式序列的一个或多个重复:
    • \s*
      -0+空格
    • (?i:Mr(?:'s)|亲爱的|嗨(?,?\s*Mrs?\b))
      -不区分大小写的修饰语组匹配:
      • Mr(?:)|
        -
        Mr
        然后是可选的
        子字符串,或
      • 亲爱的|
        -a
        亲爱的
        子字符串或
      • Hi(?,?\s*Mrs?\b)
        -
        Hi
        后面不跟可选逗号、0+空格、
        Mr
        Mrs
        作为整个单词
  • \s+
    -1+空格
  • [A-Z]
    -大写ASCII字母
  • \w*
    -0+字字符(字母、数字、
    \u
    ,若要仅匹配ASCII字母,请改用
    [A-Za-z]*
  • (?:[\s-]+[A-Z]\w*)?
    -一个可选的组,匹配1次或0次
    • [\s-]+
      -1个或多个空格或
      -
    • [A-Z]\w*
      -一个大写ASCII字母,然后是0+字字符

尝试
(?i)\b(Mr(?:)s)|亲爱的|嗨(?,?\s*Mrs?\b))\s+\w+(?:\s+\w+)
并替换为
$1@name
,请参见。可能三个捕获组是名称前的部分、名称后的部分。注意:我从未将“Mr's”作为标题。那不应该是太太或小姐吗?查看与“我们”匹配的@WiktorStribiżew@Wiktor Stribiżew,当然:)
\b((?:\s*(?i:Mr(?:'s)?|Dear|Hi(?!,?\s*Mrs?\b)))+)\s+[A-Z]\w*(?:[\s-]+[A-Z]\w*)?
$1 @name