【问题标题】:How do I get the first group of alpha characters from string?如何从字符串中获取第一组字母字符?
【发布时间】:2016-09-02 12:04:56
【问题描述】:

如果我有一个字符串,我如何从字符串中提取第一个字母字符,以便我以起始字母字符或空字符串结尾。例如:

AB12 9HG => "AB"
PJ11 => "PJ"
123JO => ""

这可以通过正则表达式实现还是有更简单的方法?

【问题讨论】:

    标签: c# regex split


    【解决方案1】:

    这是一个示例 (https://dotnetfiddle.net/CiIaqx):

        var inputs = new [] { "ASD123", "PJ11", "123JO" };
        foreach (var input in inputs) 
        {
            var match = Regex.Match(input, "^([a-z]*)", RegexOptions.IgnoreCase);
            if (match.Success)
            {
                Console.WriteLine("Checking: " + input + ", found: " + match.Groups[1].Value);
            }
        }
    

    这个输出:

    检查:ASD123,发现:ASD

    检查:PJ11,找到:PJ

    检查:123JO,发现:

    【讨论】:

      【解决方案2】:

      您可以使用 LINQ 构建结果:

      new String(s.TakeWhile(p => Char.IsLetter(p)).ToArray());
      

      基本上,只取从头到尾的字符直到第一个非字母字符。

      如果有前导空格,Trim() 字符串优先。

      【讨论】:

      • C# demo。顺便说一句,获取首字母的正则表达式是@"^\p{L}*",但在这里,您可以使用非正则表达式获得所需的内容 - 除非您只想限制某些特定的脚本。
      • 不错,一些“微优化”:您可以使用TrimStart 而不是Trim,也可以使用s.TakeWhile(Char.IsLetter)
      • 是的,TrimStart 看起来更合适。
      【解决方案3】:

      下面是另一种 LINQ 方法,可让您定义可接受的字符列表。像这样创建一个HashSet<char>

      private HashSet<char> _alphas = new HashSet<char>("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
      

      现在您可以使用这个简单高效的 LINQ 查询了:

      string result = string.Concat(input.TakeWhile(_alphas.Contains));
      

      【讨论】:

        【解决方案4】:

        可能是这样的:

        ^([A-Za-z])*
        

        【讨论】:

          【解决方案5】:

          使用正则表达式非常简单。只需用^ 锚定,然后用* 匹配零个或多个你想要的字符[A-Za-z]

          var inputs = new[] { "AB12 9HG", "PJ11", "123JO" };
          Regex regex = new Regex(@"^[A-Za-z]*");
          
          foreach (var x in inputs)
          {
              Console.WriteLine(x + " => \"" + regex.Match(x).Value + "\"");
          }
          

          输出

          AB12 9HG => "AB"

          PJ11 => "PJ"

          123JO => ""

          【讨论】:

            【解决方案6】:

            我使用的是Portable Class Library,因此无法访问字符串上的TakeWhile 方法,(或者我看不到)。

            因此,我从 Wiktors 的回答中扩展了这个想法,并为我的字符串想出了一个扩展方法:

            public static class StringExtensions
            {
                public static string GetStartChars(this string s)
                {
                    var result = string.Empty;
                    if (!string.IsNullOrEmpty(s))
                    {
                        s = s.TrimStart();
                        foreach (var letter in s.ToCharArray())
                        {
                            if (char.IsLetter(letter))
                            {
                                result += letter;
                            }
                            else
                            {
                                break;
                            }
                        }
                    }
                    return result;
                }
            }
            

            像这样使用它:

            var startChars = "AB11".GetStartChars();
            

            【讨论】:

              猜你喜欢
              • 2018-07-11
              • 2016-06-03
              • 1970-01-01
              • 1970-01-01
              • 2013-10-29
              • 2019-01-16
              • 1970-01-01
              • 2019-09-10
              • 1970-01-01
              相关资源
              最近更新 更多