You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:13:15