用于提取数字和非数字字符串的正则表达式替代方案

Regex alternative for extracting numeric and non-numeric strings

使用下面的表达式,我能够获得预期的输出并提取数字或字符串并拆分为字符串数组。

Regex _re = new Regex(@"(?<=\D)(?=\d)|(?<=\d)(?=\D)", RegexOptions.Compiled);

_re.Split("2323dfdf233fgfgfg ddfdf334").Dump();  //string can be any alphanumeric start with

如何在不使用 Regex 的情况下实现相同的功能?我需要解析每个字符并隔离吗?我有大量文本需要处理以提取,但我无法使用正则表达式作为提供的输入。

对于Linq解决方案,可以结合使用Enumerable.Skip() and Enumerable.TakeWhile() while checking for char.IsDigit()来判断字符是否为数字。例如:

string inputString = "2323dfdf233fgfgfg ddfdf334";
var list = new List<string>();

int usedLength = 0;
while (usedLength < inputString.Length)
{
    bool isDigit = char.IsDigit(inputString[usedLength]);
    string item = string.Concat(inputString.Skip(usedLength).
                                            TakeWhile((c) => char.IsDigit(c) == isDigit));
    usedLength += item.Length;
    list.Add(item);
};

然后您可以轻松地遍历列表:

foreach (string item in list)
    Console.WriteLine(item);

输出:

2323
dfdf
233
fgfgfg ddfdf
334

这个解决方案足够快。检查更大的字符串。

string str = "2323dfdf233fgfgfg ddfdf334"; 

var strings = new List<string>();
var sb = new StringBuilder();
var lastCharIsNumber = char.IsDigit(str[0]);

foreach (var c in str) {
    if (char.IsDigit(c) ) {
        if (!lastCharIsNumber) {
            strings.Add(sb.ToString());
            sb.Clear();
        }
        lastCharIsNumber = true;
    }
    else {
        if (lastCharIsNumber) {
            strings.Add(sb.ToString());
            sb.Clear();
        }
        lastCharIsNumber = false;
    }
    sb.Append(c);
}
strings.Add(sb.ToString());
strings.Dump();