2013-01-19 47 views
1

删除号码时,我有一个包含以下代码的函数:性能问题,从大的字符串

Text = Text.Where(c => !Char.IsDigit(c)).Aggregate<char, string>(null, (current, c) => current + c); 

,但它是相当缓慢。无论如何,我可以加快速度吗?

+0

在这里你去朋友:'文本= “”;' – ChaosPandion

+0

是你使用'Char.IsDigit'是因为你需要处理国际数字还是因为你不知道更好? – Esailija

+0

该字符串只包含整数还是小数? – Steve

回答

8

试试这个正则表达式:

Text = Regex.Replace(Text, @"\d+", ""); 

\d+不仅仅是\d,因为它一次删除多个连续数字更高效。

3

是的,你可以使用Regex.Replace

Text = Regex.Replace(Text, "\\d", ""); 

正则表达式一个单一的数字相匹配。 Regex.ReplaceText字符串中的每个匹配项替换为空字符串""

+0

@TimPietzcker我不确定这两者的相对效率,因为它很大程度上取决于'Replace'函数的实现。 – dasblinkenlight

+0

如果他不需要处理国际数字,'[0-9]'(10个字符)应该更快,因为它覆盖的字符范围要比'\\ d'小(460个字符) – Esailija

+0

@Esailija使(几乎)没有区别。普通表达式引擎中的字符类查找是高度优化的,大约需要O(1),即它独立于字符类中的字符数。其他一切都会使正则表达式先验无法使用。 –

1

试用Regex.Replace;

在指定的输入字符串中,用指定的替换字符串替换与常规 表达式模式匹配的字符串。

Regex.Replace(Text, "\\d+", ""); 

这里是一个DEMO

2

所有这些连接可能会杀死你。最简单的/最好的可能是一个正则表达式:

Text = Regex.Replace(Text, "\\d", ""); 

或者你可以尝试做只有一个新的字符串实例:

Text = new string(Text.Where(c => !Char.IsDigit(c)).ToArray())