java正則表達(dá)式對特殊字符的轉(zhuǎn)義以及異常現(xiàn)象
正則表達(dá)式語法
在其他語言中,\\
表示:我想要在正則表達(dá)式中插入一個普通的(字面上的)反斜杠,請不要給它任何特殊的意義。
在 Java 中,\\
表示:我要插入一個正則表達(dá)式的反斜線,所以其后的字符具有特殊的意義。
所以,在其他的語言中(如Perl),一個反斜杠 \
就足以具有轉(zhuǎn)義的作用,而在 Java 中正則表達(dá)式中則需要有兩個反斜杠才能被解析為其他語言中的轉(zhuǎn)義作用。也可以簡單的理解在 Java 的正則表達(dá)式中,兩個 \\
代表其他語言中的一個 \
,這也就是為什么表示一位數(shù)字的正則表達(dá)式是 \\d
,而表示一個普通的反斜杠是\\\\
。
java正則表達(dá)式對特殊字符的轉(zhuǎn)義
正則表達(dá)式會對一些特殊字符進行轉(zhuǎn)義,主要有以下字符:
'$', '(', ')', '*', '+', '.', '[', ']', '?', '\\', '^', '{', '}', '|'
比如,正則表達(dá)式對特殊字符’ | ’ 的轉(zhuǎn)義:
public static void main(String[] args) { String str = "a|b|c"; // 錯誤示范 // str.split("|"); // // 正確的寫法,應(yīng)該在需要轉(zhuǎn)義的字符前加上 "\\" String[] split = str.split("\\|"); for (String s : split) { System.out.print(s + " "); // 控制臺打印 a b c } }
異常現(xiàn)象
正則需要轉(zhuǎn)義字符:
'$', '(', ')', '*', '+', '.', '[', ']', '?', '\\', '^', '{', '}', '|'
異?,F(xiàn)象: java.util.regex.PatternSyntaxException: Dangling meta. character '*' near index 0
解決方法: 對特殊字符加\轉(zhuǎn)義即可。
注意:雖然使用[]在部分條件下也可以,但是在對于(、[、{范圍邊界開始符不匹配的情況下會報如下:
異?,F(xiàn)象:java.util.regex.PatternSyntaxException: Illegal repetition near index 50
Java過濾正則表達(dá)式特殊字代碼如下(注意:\需要第一個替換,否則replace方法替換時會有邏輯bug)
/** * 轉(zhuǎn)義正則特殊字符 ($()*+.[]?\^{},|) * * @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; }
實戰(zhàn)
后臺傳回的網(wǎng)址:http://192.168.1.17:8096/detection-admin\video\2020\11\4\浙B99939\3604252011040004\浙B99939_1_PDASP_01.mp4
通過工具類轉(zhuǎn)換:
/** * @author Longchengbin * @description 將網(wǎng)址反斜杠轉(zhuǎn)成正斜杠并將中文轉(zhuǎn)為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("\\\\", "/"). //將中文轉(zhuǎn)成16進制字符 replace(s1, URLEncoder.encode(s1, "utf-8")).replace(s2, URLEncoder.encode(s2, "utf-8")); LogUtils.w(s); } catch (UnsupportedEncodingException e) { LogUtils.e("網(wǎng)址轉(zhuǎn)換報錯:" + e.toString()); } return s; }
轉(zhuǎn)換后:
http://192.168.1.17:8096/detection-admin/video/2020/11/4/%E6%B5%99B99939/3604252011040004/%E6%B5%99B99939_1_PDASP_01.mp4
總結(jié)
到此這篇關(guān)于java正則表達(dá)式對特殊字符的轉(zhuǎn)義以及異常現(xiàn)象的文章就介紹到這了,更多相關(guān)java正則對特殊字符轉(zhuǎn)義內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實現(xiàn)百度云OCR文字識別 高精度OCR識別身份證信息
這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)百度云OCR文字識別,高精度OCR識別身份證信息,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-11-11SpringBoot Mybatis動態(tài)數(shù)據(jù)源切換方案實現(xiàn)過程
這篇文章主要介紹了SpringBoot+Mybatis實現(xiàn)動態(tài)數(shù)據(jù)源切換方案過程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04Jmeter參數(shù)化實現(xiàn)方法及應(yīng)用實例
這篇文章主要介紹了Jmeter參數(shù)化實現(xiàn)方法及應(yīng)用實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08Spring注解驅(qū)動之ApplicationListener異步處理事件說明
這篇文章主要介紹了Spring注解驅(qū)動之ApplicationListener異步處理事件說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09