【问题标题】:Regex help required, struck with the usage of backslash需要正则表达式帮助,使用反斜杠
【发布时间】:2014-05-13 20:35:09
【问题描述】:

我正在尝试创建一个 Java 正则表达式,如果字符串末尾有奇数个反斜杠(),它将返回 true,如果偶数则返回 false。

这是我的正则表达式

    String regex = "^.*[^\\](\\\\)*\\$";
    Pattern pattern = Pattern.compile(regex);

当我编译代码时出现以下异常

线程“main”java.util.regex.PatternSyntaxException 中的异常:索引 15 附近的未封闭字符类 ^.([^])(\)\$

如果我使用 M 模式代替反斜杠编译并且工作正常

    String regex = "^.*" + "[^M]" + "(MM)*M$";

我知道这是一种逃避问题,但我无法弄清楚。以下是整个方法

    private static void testSpecificRegex() {
    String a = "india\\";
    String b = "india\\\\";
    String c = "india\\\\\\";
    String d = "india\\\\\\\\";

/*  String a = "indiaM";
    String b = "indiaMM";
    String c = "indiaMMM";
    String d = "indiaMMMM";*/

    String regex = "^.*[^\\](\\\\)*\\$";
    //String regex = "^.*" + "[^M]" + "(MM)*M$";
    System.err.println(regex);
    Pattern pattern = Pattern.compile(regex); // why i need to compile
    Matcher matcher = pattern.matcher(a); 
    System.err.println(matcher.matches());
    matcher = pattern.matcher(b); 
    System.err.println(matcher.matches());
    matcher = pattern.matcher(c); 
    System.err.println(matcher.matches());
    matcher = pattern.matcher(d); 
    System.err.println(matcher.matches());
}

【问题讨论】:

    标签: java regex


    【解决方案1】:

    您可以在(?<!..) 后面使用否定的lookbehind 来检查前面是否没有反斜杠,并在Mathieu 注意到时转义反斜杠。

     String regex = "(?<!\\\\)(?:\\\\{2})*\\\\$";
    

    或相同而无需后视:

    String regex = "(?:^|[^\\\\])(?:\\\\{2})*\\\\$";
    

    【讨论】:

    • 这并没有解决偶数与奇数的问题。
    【解决方案2】:

    这个作品"^.*[^\\\\](\\\\\\\\)*\\\\$"。您只是忘记了一些反斜杠。
    您可以使用this site 来测试您的正则表达式。
    哦,您应该检查 this 以确保 ^$ 运算符按您的想法工作。
    来自链接:

    默认情况下,这些表达式只匹配整个输入序列的开头和结尾

    所以如果你想匹配行首和行尾,你应该在正则表达式的开头添加“(?m)”

    【讨论】:

      【解决方案3】:

      这个问题已经在这里问了Stackoverflow Jan2013

      基本上你必须双重转义你的转义字符,因为斜杠是一个 java 和正则表达式转义字符。

      这对我有用。

      String regex = "^.*[^\\\\](\\\\){2,}$";
      

      我还添加了您可以定义不合理数量的斜线的位置。您可以像我一样决定 2 个或更多,或者将其更改为 3 个或 4 个,等等。

      我使用上面的正则表达式输出...

      ^.*^\{2,}$ 错误的 真的 真的 真的

      干杯!

      【讨论】:

        【解决方案4】:

        这样就可以了:

        (^|[^\\\\]+)(\\\\\\\\)*$

        解释:

        • 它可能没有字母开头。

        • 零也是偶数

        • 您只需强制字符串以 \\ 的倍数结尾。那是。 \\ \\\ \\\\

        使用此站点调试正则表达式和额外信息: http://regex101.com/

        【讨论】:

          猜你喜欢
          • 2012-02-25
          • 2012-11-30
          • 2023-03-19
          • 1970-01-01
          • 2012-06-01
          • 2021-08-29
          • 1970-01-01
          相关资源
          最近更新 更多