如何通过 Regex 匹配以可选字符串结尾的值?

How to match values ending with an optional string through Regex?

我正在尝试从文本片段中提取名字,该片段可选择在同一行中包含姓氏:<first_name>name<last_name>

例如:

Text: JohnnameSnow -> Result: John
Text: John -> Result: John

所以我想从该行中提取 <first_name> 部分,但是如果没有 name<last_name> 它应该 return 整行。

我试过以下正则表达式:

([A-zÀ-ÿ-]{2,})(?=(?:name))

如果同一行中确实有姓氏,则可以正常工作,但如果没有,则不会 return 我完整的行。不幸的是,解决方案似乎并不像添加 |$.

那样简单

我可以寻找一个可选的结束词,如果没有出现则忽略它吗?

您可以使用

^(?<first>\p{L}+?)(?:name(?<last>\p{L}+))?$

regex demo。输出:

详情

  • ^ - 字符串开头
  • (?<first>\p{L}+?) - “第一”组:一个或多个字母,但尽可能少
  • (?:name(?<last>\p{L}+))? - 可选的非捕获组:
    • name - 一个子字符串
    • (?<last>\p{L}+) - 组“last”:一个或多个字母
  • $ - 字符串结尾。

C# demo:

var strings = new List<string> { "JohnnameSnow", "John" };
foreach (var s in strings)
{
    Console.WriteLine(s);
    var m = Regex.Match(s, @"^(?<first>\p{L}+?)(?:name(?<last>\p{L}+))?$");
    if (m.Success) 
    {
        Console.WriteLine("First name: {0}, Last name = {1}", m.Groups["first"].Value, m.Groups["last"].Value);
    }
    else
    {
        Console.WriteLine("No match!");
    }
}

输出:

JohnnameSnow
First name: John, Last name = Snow
John
First name: John, Last name =