如标题所示,我该如何捕获以下人员:
表达式应与整个姓氏匹配,而不仅仅是首字母,并且名字应不匹配。
输入字符串如下:
这是我的正则表达式:
/([S].+)(?:, [^S])/
这是我得到的结果:
施密特,P 史密斯,P
结果中包括“,”空格和字母“ P”,应排除在外。
理想的匹配是
施密特
史密斯
答案 0 :(得分:1)
您可以尝试以下模式:^S\w+(?=, [A-RT-Z])
。
^S\w+
与任何以S
开头的单词(您的情况下为名称)
(?=, [A-RT-Z])
-正向查找-确保后面没有以S
开头的单词(在您的情况下为名字)([A-RT-Z]
包括除{{1}之外的所有大写字母}。
答案 1 :(得分:1)
我做了类似的事情来捕捉名字的缩写。我刚刚更新了代码以满足您的需求。检查一下:
public static void Main(string[] args)
{
//Your code goes here
Console.WriteLine(ValidateName("FirstName LastName", 'L'));
}
private static string ValidateName(string name, char letter)
{
// Split name by space
string[] names = name.Split(new string[] {" "}, StringSplitOptions.RemoveEmptyEntries);
if (names.Count() > 0)
{
var firstInitial = names.First().ToUpper().First();
var lastInitial = names.Last().ToUpper().First();
if(!firstInitial.Equals(letter) && lastInitial.Equals(letter))
{
return names.Last();
}
}
return string.Empty;
}
答案 2 :(得分:0)
您的正则表达式对我来说很好
$array = ["Duncan, Jean","Schmidt, Paul","Sells, Simon","Martin, Jane","Smith, Peter","Stephens, Sheila"];
foreach($array as $el){
if(preg_match('/([S].+)(?:,)( [^S].+)/',$el,$matches))
echo $matches[2]."<br/>";
}
我得到的答案是
Paul
Peter
答案 3 :(得分:0)
在当前的正则表达式中,您捕获了捕获组中的姓氏,并匹配了非捕获组中的其余名。
如果将非捕获组(?:
更改为正向(?=
,则只会捕获姓氏。