正则表达式拆分需求:仅拆分未被反斜杠转义的#字符
正则拆分问题:仅拆分前接0个或偶数个反斜杠的
# 需要拆分一段文本,其中\\表示单个\,\作为字面字符的转义符。要求仅拆分前接0个或偶数个\的#,不拆分前接奇数个\的#。
当前代码
string message = @"1#2\\#3#3\#still 3#4\\\# still 4"; var v = Regex.Split(message, @"(?<!\\)#") .ToArray();
当前结果
1 2\\#3 3\#still 3 4\\\# still 4
期望结果
1 2\\ 3\#still 3 4\\\# still 4
正确的正则表达式及解释
原正则(?<!\\)#仅检查#前无单个反斜杠,无法识别前接偶数个反斜杠的情况(比如2\\#中的#前有两个反斜杠,属于转义后的字面反斜杠,该#应被拆分)。
正确的正则表达式为:
(?<!\\(?:\\\\)*)#
逻辑说明:
(?:\\\\)*:匹配任意数量(含0)的成对反斜杠,即偶数个反斜杠\\(?:\\\\)*:匹配奇数个反斜杠(1 + 2n个)(?<!...):负向回顾后发断言,确保#的前面不是奇数个反斜杠
修改后的代码:
string message = @"1#2\\#3#3\#still 3#4\\\# still 4"; var v = Regex.Split(message, @"(?<!\\(?:\\\\)*)#") .ToArray();
执行后即可得到期望的拆分结果。
内容的提问来源于stack exchange,提问作者user2903089
相关产品推荐
相关产品推荐

