我遇到了一个非常简单的问题,我想,我想在字符串中替换每个逗号','除了被数字包围的字符串。 例子:
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
我尝试使用不同的Regexes,但我无法让它像我想的那样轻松地工作。匹配我需要的逗号很容易,但问题是我认为我可以这样做:
Regex.Replace(input, @"[^\d]\s*,\s*[^\d]", ",\n");
它很酷但它改变了我的:
hey,world into: he,\norld
如果你能帮我解决这个问题,我会很高兴的。)
此致 安德鲁
答案 0 :(得分:8)
这使用负面后顾问(?<!...)
和否定前瞻(?!...)
来检查是否存在数字。
(?<![0-9])\s*,\s*|\s*,\s*(?![0-9])
表示:前面没有数字或后面没有数字。所以唯一的失败案例是:前面是数字AND后跟数字。
请注意\d
与[0-9]
不同。 ԱԲԳԴԵԶԷԸԹ0123456789
为\d
(以及其他许多人)(Armenian numerals},而0123456789
为[0-9]
我原来的正则表达式完全错了!因为它是:没有数字后面没有数字,后面跟着数字,而请求是:非数字前面或后面没有数字。
答案 1 :(得分:1)
您需要使用前瞻只匹配逗号,而不是逗号前后的字符:
(?=[^\d]\s*),(?=\s*[^\d])
添加第二个示例中显示的空格删除:
(?=[^\d]\s*)[ ]*,[ ]*(?=\s*[^\d])
答案 2 :(得分:1)
您的匹配包含您不想替换的字符,您应该使用否定前瞻断言和否定后瞻断言。 Here's a good site for regex.
@"(?<!\d)\s*,\s*(?!\d)"
上述正则表达式将直接替换逗号和任何空格。
答案 3 :(得分:0)
尝试用空字符串替换。
Regex.Replace(input, @"(?![0-9])\s*,\s*(?![0-9])", "");