一楼的思路是对的, 一般这种可以先把对象外的临时替换掉,之后再恢复.
不过从你的正则本身来看, 应该是混淆了全角与半角括号
[C#] 纯文本查看 复制代码 string pattern = @"(?<!\(.*?[^()])[。,](?![^()]*\))";
应当是
[C#] 纯文本查看 复制代码 string pattern = @"(?<!(.*?[^()])[。,](?![^()]*))";
不过这个正则本身还是有问题, 使用该正则的输出为:
这是一个测试 这里有一些内容(包括括号内的内容,不要替换这些。)以及一些,逗号和、符号;需要被替换。
括号里的没有受影响了, 但是后面 "以及一些,逗号" 中的逗号没有被替换掉. 因为这个逗号前的文本也是符合 (.*?[^()] 这个模式的
改了一下, 测试文本额外添加了一对括号
[C#] 纯文本查看 复制代码 using System.Text.RegularExpressions;
string text = "这是一个测试。这里有一些内容(包括括号内的内容,不要替换这些。)以及(包括括号内的内容,不要替换这些。)一些,逗号和、符号;需要被替换。";
string pattern = @"(?<!([^()]*)[。,](?![^()]*))";
// 替换匹配的逗号和句号为空格
string result = Regex.Replace(text, pattern, " ");
Console.WriteLine(result);
// 期望输出: 这是一个测试 这里有一些内容(包括括号内的内容,不要替换这些。)以及(包括括号内的内容,不要替换这些。)一些 逗号和、符号;需要被替换
不过还是开头那句话, 这种一般按一楼的思路来要更好, 复杂的正则总会有各种 edge case 难以考虑到, 而且可读性差
|