使用.NET正则表达式从数字中删除逗号

时间:2018-07-06 22:06:53

标签: c# regex

因此,我正在处理一个报告,该报告(出色地,实际上)在.csv输出中吐出了带有逗号的数字值。超级有用。

因此,我正在使用(C#)regex正向查找和正向查找以删除两侧都有数字的逗号。

如果仅使用前瞻,它似乎可以工作。但是,当我同时添加lookbehind时,该表达式会分解并不会删除任何内容。逗号的两端可以有任意多个数字,因此,如果模式周围有一个或多个数字,我只想删除逗号。

以下是仅适用于前瞻的表达式:

str = Regex.Replace(str, @"[,](?=(\d+)),"");

这是我无法正常使用的表达式:

str = Regex.Replace(str, @"[,](?=(\d+)?<=(\d+))", "");

我的正则表达式怎么了!如果我不得不猜测,那么我对后视的工作方式会产生误解。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您可以使用以下任何一种解决方案:

var s = "abc,def,2,100,xyz!,:))))";
Console.WriteLine(Regex.Replace(s, @"(\d),(\d)", "$1$2"));   // Does not handle 1,2,3,4 cases
Console.WriteLine(Regex.Replace(s, @"(\d),(?=\d)", "$1"));   // Handles consecutive matches with capturing group+backreference/lookahead
Console.WriteLine(Regex.Replace(s, @"(?<=\d),(?=\d)", ""));  // Handles consecutive matches with lookbehind/lookahead, the most efficient way
Console.WriteLine(Regex.Replace(s, @",(?<=\d,)(?=\d)", "")); // Also handles all cases

请参见C# demo

说明

  • (\d),(\d)-匹配并捕获,$1$2两侧的单个数字,这是替换反向引用,可将捕获的文本插入到结果中
  • (\d),(?=\d)-匹配并捕获,之前的数字,然后匹配逗号,然后正向超前(?=\d)要求,之后的数字,但由于未消耗,则替换模式需要onyl $1
  • (?<=\d),(?=\d)-仅匹配用数字括起来的逗号而不消耗数字((?<=\d)是一个正向后方,要求其模式必须与当前位置的左侧立即匹配) li>
  • ,(?<=\d,)(?=\d)-匹配逗号,只有匹配后,regex引擎才会检查位置前(即逗号之后)是否有数字和逗号,如果为true,则检查检查下一个字符是否为数字。如果是数字,则返回匹配项。

RegexHero.net测试:

enter image description here

奖金

您可以将\d,\d与您的模式相匹配,然后将匹配项传递给MatchEvaluator method,在此处您可以进一步操作匹配项:

Console.WriteLine(Regex.Replace(s, @"\d,\d", m => m.Value.Replace(",",string.Empty))); // Callback method

在这里,m是匹配对象,而m.Value保存了整个匹配值。使用.Replace(",",string.Empty),您可以从匹配值中删除所有逗号。

答案 1 :(得分:0)

您始终可以检查评估正则表达式的网站。 我认为这段代码可能会为您提供帮助:

str = Regex.Replace(str, @"[,](?=(\d+))(?<=(\d))", "");