Java正则实现:按未转义且非连续的单引号分割字符串
解决单引号分割的正则问题
你之前用的(?<!\\)'之所以会误分割,是因为它只排除了前面有反斜杠的单引号,但没考虑到连续单引号的情况——那些连续的单引号(比如字符串里的'')虽然前面没有反斜杠,但我们也不希望分割它们。
要实现「只分割未被反斜杠转义且后面不跟另一个单引号的单引号」,需要同时加上两个负向零宽断言:
(?<!\\):确保单引号前面没有反斜杠(未被转义)(?!'):确保单引号后面不是另一个单引号(不是连续单引号的一部分)
组合起来的正则就是:(?<!\\)'(?!')
代码演示
用Java代码测试的话:
public class Main { public static void main(String[] args) { String original = "Java is my 'favorite\\''\\'' prog' language"; String[] parts = original.split("(?<!\\\\)'(?!')"); String result = String.join("", parts); System.out.println(result); // 输出:Java is my favorite\\''\\'' prog language } }
这里要注意,Java字符串里的反斜杠需要转义成\\,所以正则表达式里的(?<!\\)在Java代码里要写成(?<!\\\\)。
为什么这个正则能生效?
- 对于字符串开头的
':前面没有反斜杠,后面跟着的是f(不是单引号),所以会被匹配到,作为分割点 - 对于字符串中间的
\\''里的单引号:第一个'前面有反斜杠,被(?<!\\)排除;第二个'后面是另一个',被(?!')排除,所以都不会被分割 - 对于字符串结尾的
':前面是g,没有反斜杠,后面是空格(不是单引号),所以会被匹配到,作为分割点
这样分割后再拼接,就得到了你期望的输出(Java输出里的双反斜杠是字符串转义的显示效果,实际内容和你预期的一致)。
内容的提问来源于stack exchange,提问作者Modest
相关产品推荐
相关产品推荐

