【发布时间】:2010-10-14 20:49:16
【问题描述】:
案例如下;
- 82&?
- 82,9
- abse82,9>dpkg
正则表达式之后
- 82
- 82,9
- 82,9
请帮助我在 c# 上使用 Regex 完成此操作
【问题讨论】:
标签: c# .net asp.net regex string
案例如下;
正则表达式之后
请帮助我在 c# 上使用 Regex 完成此操作
【问题讨论】:
标签: c# .net asp.net regex string
如果您使用的是 .NET3.5+,则可以使用 LINQ。没有正则表达式(更快)的解决方案如下:
var strings = new List<string>() { "82&?", "82,9", "abse82,9>dpkg" };
var result = strings.Select(s =>
String.Join("",
s.Where(c => char.IsNumber(c) || c == ',')
.ToArray()) /* .ToArray() is not needed on .NET 4 */
).ToList();
它只选择数字或逗号的字符。但是给定字符串8,1aa1,它会返回8,11。
这另一种方法有点慢,但它会从8,1aa1 取8,1 而不会取8,a 或a,a:
var strings = new List<string>() { "82&?887..2", "82,9", "abse82,9>dpkg" };
var result = strings.Select(s =>
String.Join("",
s.SkipWhile(c => !char.IsNumber(c))
.TakeWhile(c => (char.IsNumber(c) || c == ','))
.ToArray()
)
).Where(s => char.IsNumber(s.LastOrDefault())).ToList();
使用我得到的答案中提供的方法运行 100,000 次迭代的测试(使用秒表):
Fn: BrunoLM (Method 1)
Ticks: 524999
Fn: BrunoLM (Method 2)
Ticks: 729460
Fn: Ahmad
Ticks: 1323366
Fn: Josh
Ticks: 3783158
1000~ 长度字符串的相同测试:
var strings = new List<string>() { "82&?887..2".PadRight(1000, '2'), "82,9".PadRight(1000, '1'), "abse82,9>dpkg".PadRight(1000, 'f') };
结果:
Fn: Ahmad
Ticks: 11911332
Fn: BrunoLM (Method 2)
Ticks: 28149495
Fn: Josh
Ticks: 213681541
进一步阅读:
正则表达式和文本大小n
【讨论】:
Method 2。我没有说你的回答不好。我是说正则表达式在某些情况下很慢。如果他的文本有很多字符,那么您的解决方案会更快,如上所示。
使用此模式:\d+(,\d+)?。
\d:匹配 0-9 的数字+:匹配模式至少一次,所以\d+至少匹配一位数字(,\d+)?:这表示一个组(使用括号)匹配逗号后跟数字并且可选匹配它(由于组末尾的?)代码sn-p:
string[] inputs = { "82&?", "82,9", "abse82,9>dpkg", "foobar" };
foreach (var input in inputs)
{
Match m = Regex.Match(input, @"\d+(,\d+)?");
if (m.Success)
{
Console.WriteLine(m.Value);
}
else
{
Console.WriteLine("No match!");
}
}
【讨论】:
如果您只是在寻找这些字符并试图撕掉其他任何内容,您可以执行以下操作
var strings = new List<string>()
{
"82&?",
"82,9",
"abse82,9>dpkg"
};
var reg = new Regex("[^0-9,]*", RegexOptions.None);
var output = new List<string>();
foreach(var str in strings)
{
output.Add(reg.Replace(str, ""));
}
【讨论】: