2017-05-25 65 views
0

[^ \ u0009 \ u000A \ u000D \ u0020- \ uD7FF \ uE000- \ uFFFD \ uD800 \ uDC00- \ uDBFF \ uDFFF]java.util.regex.PatternSyntaxException:鄰近索引非法字符範圍71

的上面一行顯示非法字符範圍異常。誰能幫幫我嗎。

如果我直接在java代碼中使用上面的行,它不會顯示任何錯誤。

Pattern xmlInvalidChars = Pattern.compile("[^\\u0009\\u000A\\u000D\\u0020-\\uD7FF\\uE000-\\uFFFD\uD800\uDC00-\uDBFF\uDFFF]"); 

但是,如果從配置xml文件中獲取字符串並在java代碼中使用,則顯示錯誤。

String chars = ConfigLoader.getInstance().getInvalidCharacters(); 
Pattern xmlInvalidChars = Pattern.compile(chars); 
+1

問題出在'\ uDC00- \ uDBFF'上,這個範圍是亂序的。你需要什麼來匹配模式?也許你需要刪除連字符來刪除錯誤的範圍?另外,您需要在XML中使用單個反斜槓。 –

+0

As @WiktorStribiżew表示,請參閱https://en.wikipedia.org/wiki/UTF-8#Invalid_code_points – Simon

回答

0

我在配置xml文件中使用了下面的行。

[^\\u0009\\u000A\\u000D\\u0020-\\uD7FF\\uE000-\\uFFFD\uD800\\uDC00-\\uDBFF\uDFFF] 

這是我使用了相反的情況。我改變了單斜槓雙斜線(\到\)和雙斜槓單斜槓(\到)。它正在工作。

1

我還不能評論,所以我會作爲答覆發佈。在你的字符串裏面你有反斜槓\uD800\uDC00-\uDBFF\uDFFF,因此,它將\u當作逃生字符,但它不是。只需添加雙反斜槓作爲你的正則表達式的其餘部分。


編輯:編譯模式之前,請嘗試使用雙斜槓來代替單一的斜線。

chars = chars.replace("\\","\\\\"); 
+0

它不工作......其實我正在使用此模式來包裝傳入xml中存在的無效字符與CDATA文件。但這種解決方案不工作... – Gopinath

+0

嗯,也許這是因爲它正在從文件中加載文字字符串? 你可以嘗試在你的xml文件中替換雙斜槓的單斜線。或者嘗試在java中替換它。相應地編輯我的答案。 –

相關問題