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
;similarly
aac
将是
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])", "");