用于提取数字和非数字字符串的正则表达式替代方案
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();
使用下面的表达式,我能够获得预期的输出并提取数字或字符串并拆分为字符串数组。
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();