我正在尝试从文本片段中提取一个名字,该文本片段可以选择在与以下相同的行中包含一个姓氏: <first_name>name<last_name>
例如:
Text: JohnnameSnow -> Result: John
Text: John -> Result: John
因此,我想<first_name>
从该行中提取该部分,但如果没有name<last_name>
,则应返回整行。
我已经尝试了以下正则表达式:
([A-zÀ-ÿ-]{2,})(?=(?:name))
如果同一行中确实有姓氏,那效果很好,但如果没有姓氏,则不会返回完整行。不幸的是,该解决方案似乎不像添加那样容易|$
。
我可以寻找可选的结尾词,如果没有出现,可以忽略它吗?
您可以使用
^(?<first>\p{L}+?)(?:name(?<last>\p{L}+))?$
请参阅regex演示。输出:
细节
^
-字符串开始(?<first>\p{L}+?)
-组“第一”:一个或多个字母,但尽可能少(?:name(?<last>\p{L}+))?
-可选的非捕获组:
name
-子字符串(?<last>\p{L}+)
-组“最后”:一个或多个字母$
-字符串结尾。参见C#演示:
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 =
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句