如何通过 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 =
我正在尝试从文本片段中提取名字,该片段可选择在同一行中包含姓氏:<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 =