使用反斜杠时需要正则表达式帮助

时间:2014-04-02 13:47:08

标签: java regex

我正在尝试创建一个Java正则表达式,如果在String的末尾有奇数个反斜杠(),则返回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());
}

4 个答案:

答案 0 :(得分:3)

这个有效"^.*[^\\\\](\\\\\\\\)*\\\\$"。你只是忘了一些反斜杠 您可以使用this site来测试正则表达式 哦,您应该检查this以确保^$运营商按您的想法正常运行。
从链接:

  

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

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

答案 1 :(得分:1)

你可以使用负向lookbehind (?<!..)检查之前没有反斜杠,并在Mathieu注意到它时转义反斜杠。

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

或同样没有外观:

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

答案 2 :(得分:1)

这样可以解决问题:

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

说明:

  • 它可能以没有字母开头。

  • 零也是偶数

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

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

答案 3 :(得分:0)

此问题已在Stackoverflow Jan2013

中提出

基本上你必须双重转义转义字符,因为斜杠是java和regex转义字符。

这对我有用。

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

我还添加了你可以定义什么是不合理数量的斜杠的地方。您可以像我一样决定2个或更多,或者将其更改为3或4等。

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

^。* ^ \ {2,} $ 假 真正 真正 真

干杯!