如何提取人的姓氏以“ S”开头,而姓氏不是以“ S”开头

时间:2018-08-17 11:21:28

标签: regex

如标题所示,我该如何捕获以下人员:

  • 姓氏以字母“ S”开头
  • 名字以字母“ S”开头

表达式应与整个姓氏匹配,而不仅仅是首字母,并且名字应匹配。

输入字符串如下:

  • (姓氏)(名字)
  • Duncan,Jean
  • 施密特,保罗
  • 销售,西蒙
  • 马丁,简
  • 史密斯,彼得
  • 希拉·斯蒂芬斯

这是我的正则表达式:

/([S].+)(?:, [^S])/

这是我得到的结果:

  

施密特,P   史密斯,P

结果中包括“,”空格和字母“ P”,应排除在外。

理想的匹配是

  

施密特

     

史密斯

4 个答案:

答案 0 :(得分:1)

您可以尝试以下模式:^S\w+(?=, [A-RT-Z])

^S\w+与任何以S开头的单词(您的情况下为名称)

(?=, [A-RT-Z])-正向查找-确保后面没有以S开头的单词(在您的情况下为名字)([A-RT-Z]包括除{{1}之外的所有大写字母}。

Demo

答案 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)

在当前的正则表达式中,您捕获了捕获组中的姓氏,并匹配了非捕获组中的其余名。

如果将非捕获组(?:更改为正向(?=,则只会捕获姓氏。

([S].+)(?=, [^S])或更短的S.+(?=, [^S])