java 文本转义_如何在Java中转义文本以进行正则表达式

Java是否有内置的转义任意文本的方式,以便可以将其包含在正则表达式中? 例如,如果我的用户输入“ $ 5”,我想在输入结束后精确匹配而不是“ 5”。

#1楼

首先,如果

您使用replaceAll()

您不要使用Matcher.quoteReplacement()

要替换的文本包括$ 1

它不会以1结尾。 它将查找第一个匹配组和子THAT in的搜索正则表达式。这就是$ 1,$ 2或$ 3在替换文本中的含义:匹配搜索模式中的组。

我经常将一长串文本插入.properties文件,然后从中生成电子邮件主题和正文。 实际上,这似乎是在Spring Framework中执行i18n的默认方法。 我将XML标记作为占位符放入字符串中,并在运行时使用replaceAll()将XML标记替换为值。

我遇到了一个问题,用户输入带有美元符号的美分数字。 replaceAll()令人窒息,在stracktrace中显示以下内容:

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()继续在搜索正则表达式中查找第三个匹配组,但没有找到一个,然后将其吐出。

鉴于:

// "msg" is a string from a .properties file, containing "" among other tags

// "userInput" is a String containing the user's input

更换

msg = msg.replaceAll("", userInput);

msg = msg.replaceAll("", Matcher.quoteReplacement(userInput));

解决了问题。 用户可以输入任何种类的字符,包括美元符号,而不会出现问题。 它的行为完全符合您的期望。

#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楼

^(否定)符号用于匹配不在字符组中的字符。

这是到正则表达式的链接

这是有关取反的图像信息:

m5cXU.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值