2

我猜我遇到了一个非常简单的问题,我想替换字符串中的每个逗号“,”,除了被数字包围的那些。例子:

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 

我用不同的正则表达式尝试了它,但我真的不能让它像我想的那样容易。匹配我需要的逗号非常容易,但问题是我认为我可以这样做:

Regex.Replace(input, @"[^\d]\s*,\s*[^\d]", ",\n");

它很酷,但它改变了我的:

hey,world into: he,\norld

如果你能帮我解决这个问题,我会很高兴:)

问候, 安德鲁

4

4 回答 4

8

这使用负后瞻(?<!...)和负前瞻(?!...)来检查数字的存在。

(?<![0-9])\s*,\s*|\s*,\s*(?![0-9])

这意味着:前面没有数字或后面没有数字。所以唯一的失败案例是:前面是数字和后面是数字。

请注意,\d它不同于[0-9]. ԱԲԳԴԵԶԷԸԹ0123456789\d(和许多其他人)(它们是亚美尼亚数字),0123456789而是[0-9]

我原来的正则表达式完全错误!因为它是:前面没有数字和后面没有数字,而请求是:前面没有数字或后面没有数字。

于 2013-08-09T07:49:00.570 回答
1

您需要使用前瞻来仅匹配逗号,而不是逗号前后的字符:

(?=[^\d]\s*),(?=\s*[^\d])

添加第二个示例中所示的空格删除:

(?=[^\d]\s*)[ ]*,[ ]*(?=\s*[^\d])
于 2013-08-09T07:48:15.447 回答
1

您的匹配项包含您不想替换的字符,您应该使用否定前瞻断言否定后瞻断言
这是一个很好的正则表达式网站。

@"(?<!\d)\s*,\s*(?!\d)"

上面的正则表达式将直接替换逗号和它之前或之后的任何空格。

于 2013-08-09T07:49:32.890 回答
0

尝试用空字符串替换。

Regex.Replace(input, @"(?![0-9])\s*,\s*(?![0-9])", "");
于 2013-08-09T07:54:18.227 回答