【问题标题】:How to Extract people's last name start with "S" and first name not start with "S"如何提取人的姓氏以“S”开头,名字不以“S”开头
【发布时间】:2018-08-17 11:21:27
【问题描述】:

如标题所示,我如何捕捉一个人:

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

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

输入字符串如下:

  • (姓)(名)
  • 邓肯,让
  • 施密特,保罗
  • Sells,西蒙
  • 马丁,简
  • 史密斯,彼得
  • 斯蒂芬斯,希拉

这是我的正则表达式:

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

这是我得到的结果:

施密特,P 史密斯,P

结果包含“,”空格和字母“P”,应排除。

理想的匹配是

施密特

史密斯

【问题讨论】:

标签: regex


【解决方案1】:

你可以试试这个模式:^S\w+(?=, [A-RT-Z])

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

(?=, [A-RT-Z]) - 积极的前瞻 - 确保后面的不是以 S 开头的单词(在您的情况下是名字)([A-RT-Z] 包括除 S 之外的所有大写字母)。

Demo

【讨论】:

    【解决方案2】:

    我做了类似的事情来捕捉首字母。我刚刚更新了代码以满足您的需要。检查它:

    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;
     }
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        你的正则表达式对我很有效

        $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
        

        【讨论】:

        • 但在这种情况下,我只想提取姓氏。
        • 你的意思是只打印姓氏?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-11
        • 2015-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-16
        相关资源
        最近更新 更多