从字符串中提取char(正则表达式)

时间:2016-04-18 05:16:02

标签: c# regex

我想从下面的示例字符串中提取粗体字符。模式如下:

ChunkOfAlphabets_ChunkOfDigits_的 CharIWant _ChunkOfDigits_CharIDontCare

“ABC12的 A 1234D”

“ABCD34的 5678E”

“EF34 C 9101F”

我想出了以下代码。它似乎工作正常,但我想知道是否有更有效的方法,也许使用正则表达式?

    char extractString(string test)
    {
        bool isDigit = false;
        foreach(var c in test)
        {
            if (isDigit && !char.IsDigit(c))
                return c;

            isDigit = char.IsDigit(c);
        }

        return '0';
    }

4 个答案:

答案 0 :(得分:4)

如果你正在使用C#LINQ会更容易,更高效(正则表达式涉及很多开销):

static char ExtractString(string test)
{
    return test.SkipWhile(c => Char.IsLetter(c))
               .SkipWhile(c => Char.IsDigit(c))
               .FirstOrDefault();

}

答案 1 :(得分:3)

首先,正则表达式不应该比优秀的算法快。但是,我给你一个正则表达式尝试它并检查什么是更快。

以下正则表达式给了我你想要的东西:

^\D+\d+([A-Za-z])\d+\D+$

我建议您使用https://regex101.com/,它非常适合测试类似的内容。

答案 2 :(得分:1)

C#中的这个函数应该使用正则表达式做你期望的,但我怀疑它比一个简单的算法更有效:

    using System.Text.RegularExpressions;

    private char extractChar(string test)
    {
        char charOut = '\0';
        var matches = Regex.Matches(test, "^[a-zA-Z]+[0-9]+([a-zA-Z])[0-9]+.+");
        if (matches.Count > 0)
            charOut = matches[0].Groups[1].Value[0];

        return charOut;
    }

答案 3 :(得分:1)

假设

  

ChunkofAlphabets = [A-Za-z]< - 英文字母

     

ChunkOfDigits = [0-9]

     

CharIWant =可以是除数字[0-9]

之外的任何字符

如上所述,正则表达式应为

^[A-Za-z]+\d+(\D+)\d+.*$

<强> Regex Demo

C# Code Ideone Demo