java正则表达式对特殊字符的转义以及异常现象
作者:胡八一
正则表达式语法
在其他语言中,\\
表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠,请不要给它任何特殊的意义。
在 Java 中,\\
表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。
所以,在其他的语言中(如Perl),一个反斜杠 \
就足以具有转义的作用,而在 Java 中正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。也可以简单的理解在 Java 的正则表达式中,两个 \\
代表其他语言中的一个 \
,这也就是为什么表示一位数字的正则表达式是 \\d
,而表示一个普通的反斜杠是\\\\
。
java正则表达式对特殊字符的转义
正则表达式会对一些特殊字符进行转义,主要有以下字符:
'$', '(', ')', '*', '+', '.', '[', ']', '?', '\\', '^', '{', '}', '|'
比如,正则表达式对特殊字符’ | ’ 的转义:
public static void main(String[] args) { String str = "a|b|c"; // 错误示范 // str.split("|"); // // 正确的写法,应该在需要转义的字符前加上 "\\" String[] split = str.split("\\|"); for (String s : split) { System.out.print(s + " "); // 控制台打印 a b c } }
异常现象
正则需要转义字符:
'$', '(', ')', '*', '+', '.', '[', ']', '?', '\\', '^', '{', '}', '|'
异常现象: java.util.regex.PatternSyntaxException: Dangling meta. character '*' near index 0
解决方法: 对特殊字符加\转义即可。
注意:虽然使用[]在部分条件下也可以,但是在对于(、[、{范围边界开始符不匹配的情况下会报如下:
异常现象:java.util.regex.PatternSyntaxException: Illegal repetition near index 50
Java过滤正则表达式特殊字代码如下(注意:\需要第一个替换,否则replace方法替换时会有逻辑bug)
/** * 转义正则特殊字符 ($()*+.[]?\^{},|) * * @param keyword * @return */ public static String escapeExprSpecialWord(String keyword) { if (StringUtils.isNotBlank(keyword)) { String[] fbsArr = { "\\", "$", "(", ")", "*", "+", ".", "[", "]", "?", "^", "{", "}", "|" }; for (String key : fbsArr) { if (keyword.contains(key)) { keyword = keyword.replace(key, "\\" + key); } } } return keyword; }
实战
后台传回的网址:http://192.168.1.17:8096/detection-admin\video\2020\11\4\浙B99939\3604252011040004\浙B99939_1_PDASP_01.mp4
通过工具类转换:
/** * @author Longchengbin * @description 将网址反斜杠转成正斜杠并将中文转为16进制字符 * @since 2020-11-4 16:33 **/ public static String decode(String url) { String[] strings = url.split("\\\\"); String s1 = strings[strings.length - 1]; String s2 = strings[strings.length - 3]; String s = ""; try { //将反斜杠替换成正斜杠 s = url.replaceAll("\\\\", "/"). //将中文转成16进制字符 replace(s1, URLEncoder.encode(s1, "utf-8")).replace(s2, URLEncoder.encode(s2, "utf-8")); LogUtils.w(s); } catch (UnsupportedEncodingException e) { LogUtils.e("网址转换报错:" + e.toString()); } return s; }
转换后:
http://192.168.1.17:8096/detection-admin/video/2020/11/4/%E6%B5%99B99939/3604252011040004/%E6%B5%99B99939_1_PDASP_01.mp4
总结
到此这篇关于java正则表达式对特殊字符的转义以及异常现象的文章就介绍到这了,更多相关java正则对特殊字符转义内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!