我正在尝试创建一个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());
}
答案 0 :(得分:3)
这个有效"^.*[^\\\\](\\\\\\\\)*\\\\$"
。你只是忘了一些反斜杠
您可以使用this site来测试正则表达式
哦,您应该检查this以确保^
和$
运营商按您的想法正常运行。
从链接:
默认情况下,这些表达式仅匹配整个输入序列的开头和结尾
因此,如果你想匹配行的开头和结尾,你应该在正则表达式的开头添加“(?m)”
答案 1 :(得分:1)
你可以使用负向lookbehind (?<!..)
检查之前没有反斜杠,并在Mathieu注意到它时转义反斜杠。
String regex = "(?<!\\\\)(?:\\\\{2})*\\\\$";
或同样没有外观:
String regex = "(?:^|[^\\\\])(?:\\\\{2})*\\\\$";
答案 2 :(得分:1)
这样可以解决问题:
(^|[^\\\\]+)(\\\\\\\\)*$
说明:
它可能以没有字母开头。
零也是偶数
您只需强制该字符串以\\的倍数结束。那是。 \\ \\\ \\\\
使用此站点调试正则表达式和额外信息: http://regex101.com/
答案 3 :(得分:0)
基本上你必须双重转义转义字符,因为斜杠是java和regex转义字符。
这对我有用。
String regex = "^.*[^\\\\](\\\\){2,}$";
我还添加了你可以定义什么是不合理数量的斜杠的地方。您可以像我一样决定2个或更多,或者将其更改为3或4等。
我的输出使用上面的正则表达式...
^。* ^ \ {2,} $ 假 真正 真正 真
干杯!