解決方法一:
JavaScript:
window.self.location="searchbytext.action?searchtext="+encodeURIComponent(encodeURIComponent(seartext));
java:
searchtext=java.net.URLDecoder.decode(searchtext,"UTF-8");
為什么要兩次編碼的原因:后台java代碼給searchtext賦值的時候,本身已經使用了一次解碼,不過解碼的結果依然不對。所以我們可以在頁面上進行兩次編碼操作,這樣后台自動的那次就可以抵消掉一次,然后在使用searchtext=java.net.URLDecoder.decode(searchtext,"UTF-8");進行一次解碼就好了。
解決方法二:
另外還有一種方法是JavaScript進行一次編碼,后台java處理時換種想法就好了:
java代碼:
String s = new String(request.getParameter("name").getBytes("ISO8859-1"), "UTF-8");
正則需要轉義字符:'$', '(', ')', '*', '+', '.', '[', ']', '?', '\\', '^', '{', '}', '|'
異常現象: 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;
}
正則表達式中有些字符具有特殊的含義,如果在匹配中要用到它本來的含義,需要進行轉義(在其前面加一個\)。下面總結了常見的一些需要轉義的特殊字符:
$ 匹配輸入字符串的結尾位置。如果設置了RegExp對象的Multiline屬性,則 $ 也匹配,如‘\n’或’\r’。
() 標記一個子表達式的開始和結束位置。子表達式可以獲取供以后使用。要匹配這些字符。
* 匹配前面的子表達式零次或多次。
+ 匹配前面的子表達式一次或多次。
. 匹配除換行符\n之外的任何單字符。
[] 標記一個中括號表達式的開始。
? 匹配前面子表達式零次或一次,或指明一個非貪婪限定符
\ 將下一個字符標記為或特殊字符或原意字符或后向引用或八進制轉義符。例如:‘n’匹配字符‘n’,而‘\n’匹配換行符。序列‘\\’匹配’\’
^ 匹配輸入字符串的開始位置,除非在方括號表達式中使用,此時他表示不接受該字符集合。
{} 標記限定符表達式的開始。
| 指明兩項之間的一個選擇。
總述一下:* . ? + $ ^ [ ] ( ) { } | \ /