因此,我正在处理一个报告,该报告(出色地,实际上)在.csv输出中吐出了带有逗号的数字值。超级有用。
因此,我正在使用(C#)regex正向查找和正向查找以删除两侧都有数字的逗号。
如果仅使用前瞻,它似乎可以工作。但是,当我同时添加lookbehind时,该表达式会分解并不会删除任何内容。逗号的两端可以有任意多个数字,因此,如果模式周围有一个或多个数字,我只想删除逗号。
以下是仅适用于前瞻的表达式:
str = Regex.Replace(str, @"[,](?=(\d+)),"");
这是我无法正常使用的表达式:
str = Regex.Replace(str, @"[,](?=(\d+)?<=(\d+))", "");
我的正则表达式怎么了!如果我不得不猜测,那么我对后视的工作方式会产生误解。有什么想法吗?
答案 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)
是一个正向后方,要求其模式必须与当前位置的左侧立即匹配),(?<=\d,)(?=\d)
-匹配逗号,只有匹配后,regex引擎才会检查位置前(即逗号之后)是否有数字和逗号,如果为true,则检查检查下一个字符是否为数字。如果是数字,则返回匹配项。奖金:
您可以将\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))", "");