java正則表達(dá)式對特殊字符的轉(zhuǎn)義以及異?,F(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
}
}異?,F(xiàn)象
正則需要轉(zhuǎn)義字符:
'$', '(', ')', '*', '+', '.', '[', ']', '?', '\\', '^', '{', '}', '|'異?,F(xiàn)象: java.util.regex.PatternSyntaxException: Dangling meta. character '*' near index 0
解決方法: 對特殊字符加\轉(zhuǎn)義即可。
注意:雖然使用[]在部分條件下也可以,但是在對于(、[、{范圍邊界開始符不匹配的情況下會報如下:
異常現(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)義以及異?,F(xiàn)象的文章就介紹到這了,更多相關(guān)java正則對特殊字符轉(zhuǎn)義內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳談cxf和axis兩種框架下的webservice客戶端開發(fā)
這篇文章主要介紹了詳談cxf和axis兩種框架下的webservice客戶端開發(fā),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
Spring boot實現(xiàn)文件上傳實例(多文件上傳)
本篇文章主要介紹了Spring boot實現(xiàn)文件上傳實例(多文件上傳),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05
SpringBoot實現(xiàn)固定和動態(tài)定時任務(wù)的三種方法
定時器是我們項目中經(jīng)常會用到的,本文主要介紹了SpringBoot實現(xiàn)固定和動態(tài)定時任務(wù)的三種方法,具有一定的參考價值,感興趣的可以了解一下2023-09-09
Spring MVC Mybatis多數(shù)據(jù)源的使用實例解析
項目需要從其他網(wǎng)站獲取數(shù)據(jù),因為是臨時加的需求,這篇文章主要介紹了Spring MVC Mybatis多數(shù)據(jù)源的使用實例解析,需要的朋友可以參考下2016-12-12

