C# 在C中用正则表达式替换逗号#
我遇到了一个非常简单的问题,我想,我想替换字符串中的每个逗号',除了那些被数字包围的逗号。 示例:C# 在C中用正则表达式替换逗号#,c#,.net,C#,.net,我遇到了一个非常简单的问题,我想,我想替换字符串中的每个逗号',除了那些被数字包围的逗号。 示例: hey, world -> hey,\nworld hey , world -> hey,\nworld they are simple, but now also: hey,world -> hey,\nworld hey),world -> hey),\nworld (1,2) -> (1,2) << no change :P 它工作起来很酷,
hey, world -> hey,\nworld
hey , world -> hey,\nworld
they are simple, but now also:
hey,world -> hey,\nworld
hey),world -> hey),\nworld
(1,2) -> (1,2) << no change :P
它工作起来很酷,但它改变了我的:
hey,world into: he,\norld
如果你能帮我解决这个问题,我会很高兴:)
问候,,
Andrew您需要使用lookaheads仅匹配逗号,而不是逗号前后的字符:
(?=[^\d]\s*),(?=\s*[^\d])
添加删除第二个示例中显示的空格:
(?=[^\d]\s*)[ ]*,[ ]*(?=\s*[^\d])
这使用负向后看
(?和负向前看(?!…)
来检查是否存在数字
(?<![0-9])\s*,\s*|\s*,\s*(?![0-9])
(?
它的意思是:前面没有数字或后面没有数字。因此,唯一的故障情况是:前面有数字,后面有数字
请注意,\d
与[0-9]
不同,而0123456789
是\d
(和许多其他的)(他们是),而0123456789
是[0-9]
我原来的正则表达式是完全错误的!因为它是:不带数字,也不带数字,而请求是:不带数字或不带数字。如果匹配的字符包含不想替换的字符,则应使用负前瞻断言和负前瞻断言。
@”(?尝试用空字符串替换
Regex.Replace(input, @"(?![0-9])\s*,\s*(?![0-9])", "");
第2行的空格移除是需要的?是的,我也想移除所有的空格。啊,这正是我想要的,我听说了这些lookbehinds/aheads,但我不知道它实际上做了什么,现在它清楚了:]谢谢;)@AndrzejCzerwoniec只有一个澄清:负面前瞻不是(?!=…)
,而是(?!…)
。我在编辑中修复了正则表达式。好吧;)带等号的正则表达式也适用于我:P@AndrzejCzerwoniec带有=
的代码不会替换(1,a)
和(a,=1)中的、
我明白了,但我发现id现在也不匹配;P它找不到任何前后匹配的数字,所以它仍然不匹配(1,a),或者我没有什么错吗?:pI想去掉所有空白,所以第一个很酷,谢谢;)我想你不太明白这个问题:OP想把a,b
或a,b
或a,b
(逗号前后的任意数量的空格)替换为a,\nb
;但不是1,2
或1,2
,等等。你的Regex.replace
将两者都替换。再次阅读问题:(1,2)->(1,2)发生了什么?如果你的正则表达式是a(?!b)
使用Regex.Replace
将abc
替换为0
,您将得到abc
,因为Regex不匹配。如果要将aac
替换为0
,您将得到00c
,因为Regex确实匹配,但匹配一次只包含一个a
;similarlyaac
将是000c
。如果您的正则表达式改为a[^b]
,那么abc
将保持abc
,但是aac
将被替换为0c
,因为匹配项包含aa
,因此aaac
将成为00
。而且,(?!)
是向前看的,所以a(?!b)
和(?!b)a
也这样做。回头看是(?啊,我不知道那个网站,我一定会仔细看看:)
@"(?<!\d)\s*,\s*(?!\d)"
Regex.Replace(input, @"(?![0-9])\s*,\s*(?![0-9])", "");