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"));
^(否认)符号用于匹配不在字符组中的字符。
这是到正则表达式的连接
这是有关取反的图像信息: