如何从字符串捕获中排除可选的尾随逗号?

How to exclude an optional trailing comma from string capture?

我正在用头撞墙试图允许排除(未捕获)可选的尾随逗号。我正在尝试从电子邮件称呼(从模板生成)中提取名称,并且需要正则表达式不捕获结尾的逗号;但我也在尝试增加一些余量,以防有人不小心删除了结尾的逗号。我已将逗号放在非捕获组中并将其设为可选(零或其中之一),但它仍包含在输出中。

正则表达式:(?:Hi|Dear)\s*(.*)(?:,?)

输入:Hi John,

预期输出:John

实际输出:John,

我不确定这个问题是否与正则表达式不喜欢同一表达式中的多个非捕获组有关,但如果我将逗号设置为非可选,它会按预期运行:

正则表达式:(?:Hi|Dear)\s*(.*),

输入:Hi John,

预期输出:John

实际输出:John


任何帮助将不胜感激

供参考https://regex101.com/r/WzbxD9/1

只需将最后一个字符设为“不是逗号”即可:

(?:Hi|Dear)\s*(.*[^,])

live demo

这适用于多种输入格式:

Input Match group 1
Hi John John
Hi John, John
Dear John, Sally and Fred Dear John, Sally and Fred
Dear John, Sally and Fred, Dear John, Sally and Fred

你的表达式中的 .* 是贪心的,所以它已经包含了逗号。相反,您可以匹配任何 but 逗号,后跟一个可选的逗号:

(?:Hi|Dear)\s*([^,]+),?

额外的功劳:提到多人的称呼怎么样,比如“亲爱的约翰、大卫和艾比”,

这有点棘手,但您可以在名称中允许任何字符,只要它以一个非逗号结尾,后跟一个可选的逗号即可:

(?:Hi|Dear)\s*(.+[^,\s]),?

在这里,第 1 组捕获了没有尾随逗号的“John、David 和 Abby”。