如何在Java中轉義文本以進行正則表達式

Java是否有內置的轉義任意文本的方式,以即可以將其包含在正則表達式中? 例如,若是個人用戶輸入「 $ 5」,我想在輸入結束後精確匹配而不是「 5」。 java


#1樓

首先,若是 正則表達式

  • 您使用replaceAll()
  • 您不要使用Matcher.quoteReplacement()
  • 要替換的文本包括$ 1

它不會以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


#2樓

要得到受保護的模式,能夠將全部符號替換爲「 \\\\\\\\」,數字和字母除外。 而後,您能夠在該受保護的模式中添加特殊符號,以使該模式不像愚蠢的引用文本那樣工做,而實際上像木套紙,而是您本身的樣式。 沒有用戶特殊符號。

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");
    }
}

#3樓

可能爲時已晚,可是您也可使用Pattern.LITERAL ,它在格式化時會忽略全部特殊字符:

Pattern.compile(textToFormat, Pattern.LITERAL);

#4樓

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"));

#5樓

^(否認)符號用於匹配不在字符組中的字符。

這是到正則表達式的連接

這是有關取反的圖像信息:

有關否認的信息

相關文章
相關標籤/搜索