Java 没有转义,以便它可以包含正则表达式中的任意文本的内置方法吗?例如,如果用户输入"$5",我想完全而不是"5"匹配后的输入端。

2008-09-12 23:36:36
问题评论:

回答:

因为Java 1.5,没错:

Pattern.quote("$5");

其他人已张贴了同样可行,的确挑一个,使代码对您最别致 !:-)

请注意,这不转义字符串本身,但包装使用QE这可能导致意外结果,例如Pattern.quote("*.wav").replaceAll("*",".*")将导致Q.*.wavE而不.*.wav,如预期的那样。

为什么您还想让该 foo(x).bar() @Paramaeleon x.bar() = =?

我认为您的 @Paramaeleon misunderstanding 的用例。

我只是指出这种方式转义的适用也转义表达式之后引入的 wantet。这可能是令人惊讶。如果执行"mouse".toUpperCase().replaceAll("OUS","ic")将返回MicEWould't 您预期的那样返回MICE,因为您没有将toUpperCase()应用在ic我的示例中, quote()应用于.*replaceAll()以及 insertet。您需要执行其他操作, .replaceAll("*","E.*Q")也许会起作用,但这是有悖常理。

Pattern.quoteMatcher.quoteReplacement之间的区别已不清楚我之前我看到以下示例

s.replaceFirst(Pattern.quote("text to replace"), 
               Matcher.quoteReplacement("replacement text"));

具体来说, Pattern.quote替换特殊字符在正则表达式搜索字符串,像。 |+ () 等,以及Matcher.quoteReplacement替换为后向引用 1 类似的替换字符串中的特殊字符。

我不同意。Pattern.quote 包装其参数 Q 和 e。它不进行转义特殊字符。

Matcher.quoteReplacement ("4$ & %$") 产生"4$ & %$"。转义特殊字符。

换句话说︰ quoteReplacement只关心两个符号$ 的例如可在替换字符串中作为反向引用$11它因此必须不能用于转义/报价的正则表达式。

超。下面是一个示例,我们希望将$Group$ T$UYO$HI$符号是在图案和替换特殊︰ "$Group$ Members".replaceFirst(Pattern.quote("$Group$"), Matcher.quoteReplacement("T$UYO$HI"))

我觉得什么你之后是Q$5E请参阅Pattern.quote(s)在 Java5 中引入的。

将 javadoc模式的详细信息,请参阅。

我很好奇如果这和使用原义的标志,因为 javadoc 说没有打开和关闭切换文本没有嵌入的标志之间的任何差异︰ java.sun.com/j2se/1.5.0/docs/api/java/util/regex/...

注意按原义使用 Q 和 E 才好,如果您知道您的输入。Pattern.quote(s) 还将处理文本实际上包含这些序列的大小写。

首先说如果

  • 使用 replaceAll()
  • 不要使用 Matcher.quoteReplacement()
  • 在要替换的文本包含 $1

在结束时不能使 1。它将匹配的第一组的搜索正则表达式来看,子中的。这是什么 $1、 $2 或 3 美元的替换文本中表示︰ 匹配的组中搜索模式。

我经常长字符串文本插入.properties 文件,然后从那些生成电子邮件主题和正文。实际上,这似乎是为 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() 出现在第三个匹配组搜索正则表达式查找,没有找到一个,和 puked。

给出︰

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

使用

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

解决了问题。用户可以将放在任何类型的字符,包括美元符号,没有问题。它是的完全可能的。

具有保护模式可能会与"\"除了数字和字母替换所有符号。而之后,放入该受保护模式您特殊的符号,以使工作不像那些愚蠢的做法带引号的文本,此模式但喜欢 patten,但自己。而无需用户特殊符号。

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

不需要转义空格。因此您可以更改对您的模式"([^ a-zA-z0-9])"。

小的拼写错误、 大后果:"([^ a-zA-z0-9])"还不匹配 (亦即未转义) [,],^ 当然要有转义 !输入错误的第二个 z 这应该是 Z,否则一切从 ASCII 65 到 ASCII 122 是包括

请输入您的翻译

How to escape text for regular expression in Java

确认取消