Java是否有內置的轉義任意文本的方式,以即可以將其包含在正則表達式中? 例如,若是個人用戶輸入「 $ 5」,我想在輸入結束後精確匹配而不是「 5」。 java
首先,若是 正則表達式
它不會以1結尾。 它將查找第一個匹配組和子THAT in的搜索正則表達式。這就是$ 1,$ 2或$ 3在替換文本中的含義:匹配搜索模式中的組。 app
我常常將一長串文本插入.properties文件,而後從中生成電子郵件主題和正文。 實際上,這彷佛是在Spring Framework中執行i18n的默認方法。 我將XML標記做爲佔位符放入字符串中,並在運行時使用replaceAll()將XML標記替換爲值。 測試
我遇到了一個問題,用戶輸入帶有美圓符號的美分數字。 replaceAll()使人窒息,在stracktrace中顯示如下內容: spa
java.lang.IndexOutOfBoundsException: No group 3 at java.util.regex.Matcher.start(Matcher.java:374) at java.util.regex.Matcher.appendReplacement(Matcher.java:748) at java.util.regex.Matcher.replaceAll(Matcher.java:823) at java.lang.String.replaceAll(String.java:2201)
在這種狀況下,用戶在輸入中的某處輸入了「 $ 3」,replaceAll()繼續在搜索正則表達式中查找第三個匹配組,但沒有找到一個,而後將其吐出。 code
鑑於: orm
// "msg" is a string from a .properties file, containing "<userInput />" among other tags // "userInput" is a String containing the user's input
更換 字符串
msg = msg.replaceAll("<userInput \\/>", userInput);
與 get
msg = msg.replaceAll("<userInput \\/>", Matcher.quoteReplacement(userInput));
解決了問題。 用戶能夠輸入任何種類的字符,包括美圓符號,而不會出現問題。 它的行爲徹底符合您的指望。 input
要得到受保護的模式,能夠將全部符號替換爲「 \\\\\\\\」,數字和字母除外。 而後,您能夠在該受保護的模式中添加特殊符號,以使該模式不像愚蠢的引用文本那樣工做,而實際上像木套紙,而是您本身的樣式。 沒有用戶特殊符號。
public class Test { public static void main(String[] args) { String str = "y z (111)"; String p1 = "x x (111)"; String p2 = ".* .* \\(111\\)"; p1 = escapeRE(p1); p1 = p1.replace("x", ".*"); System.out.println( p1 + "-->" + str.matches(p1) ); //.*\ .*\ \(111\)-->true System.out.println( p2 + "-->" + str.matches(p2) ); //.* .* \(111\)-->true } public static String escapeRE(String str) { //Pattern escaper = Pattern.compile("([^a-zA-z0-9])"); //return escaper.matcher(str).replaceAll("\\\\$1"); return str.replaceAll("([^a-zA-Z0-9])", "\\\\$1"); } }
可能爲時已晚,可是您也可使用Pattern.LITERAL
,它在格式化時會忽略全部特殊字符:
Pattern.compile(textToFormat, Pattern.LITERAL);
Pattern.quote(「 blabla」)效果很好。
Pattern.quote()能夠很好地工做。 它用「 \\ Q 」和「 \\ E 」兩個字符括起來,若是確實轉義了「 \\ Q」和「 \\ E」。 可是,若是您須要執行真正的正則表達式轉義(或自定義轉義),則可使用如下代碼:
String someText = "Some/s/wText*/,**"; System.out.println(someText.replaceAll("[-\\[\\]{}()*+?.,\\\\\\\\^$|#\\\\s]", "\\\\$0"));
此方法返回: Some / \\ s / wText * / \\,**
代碼示例和測試:
String someText = "Some\\E/s/wText*/,**"; System.out.println("Pattern.quote: "+ Pattern.quote(someText)); System.out.println("Full escape: "+someText.replaceAll("[-\\[\\]{}()*+?.,\\\\\\\\^$|#\\\\s]", "\\\\$0"));
^(否認)符號用於匹配不在字符組中的字符。
這是到正則表達式的連接
這是有關取反的圖像信息: