【问题标题】:What is the use of Pattern.quote method?Pattern.quote 方法有什么用?
【发布时间】:2013-03-02 19:16:57
【问题描述】:

我正在尝试使用以下代码理解Pattern.quote

String pattern = Pattern.quote("1252343% 8 567 hdfg gf^$545");
System.out.println("Pattern is : "+pattern);

产生输出:

Pattern is : \Q1252343% 8 567 hdfg gf^$545\E

这里的\Q\E 是什么?文档描述说:

为指定的String 返回文字模式String

此方法生成一个String,可用于创建一个Pattern,该Pattern 将匹配字符串s,就好像它是一个文字模式一样。

输入序列中的元字符或转义序列不会被赋予特殊含义。

但是Pattern.quote 的返回类型是String 而不是编译后的Pattern 对象。

为什么需要这种方法?有哪些使用示例?

【问题讨论】:

    标签: java regex pattern-matching


    【解决方案1】:

    \Q 表示“文字文本的开头”(即正则表达式“打开引号”)
    \E 表示“文字文本结束”(即正则表达式“关闭引号”)

    调用Pattern.quote() 方法会将字符串包装在\Q...\E 中,这会将文本转换为正则表达式文字。例如,Pattern.quote(".*") 将匹配一个点,然后是一个星号:

    System.out.println("foo".matches(".*")); // true
    System.out.println("foo".matches(Pattern.quote(".*"))); // false
    System.out.println(".*".matches(Pattern.quote(".*"))); // true
    

    该方法的目的是不要求程序员必须记住特殊术语 \Q\E 并为代码添加一点可读性 - 正则表达式已经很难阅读。比较:

    someString.matches(Pattern.quote(someLiteral));
    someString.matches("\\Q" + someLiteral + "\\E"));
    

    参考javadoc

    返回指定字符串的文字模式字符串。

    此方法生成一个字符串,可用于创建一个模式,该模式将匹配字符串 s,就好像它是文字模式一样。

    输入序列中的元字符或转义序列不会被赋予特殊含义。

    【讨论】:

    • 正确的等价于someString.matches(Pattern.quote(someLiteral))其实是someString.matches("\\Q" + someLiteral.replace("\\E", "\\E\\\\E\\Q") + "\\E")
    • @kbolino Rofl。那么替换“\\Q”呢?
    • @Andrew 它也处理这个问题:"\\Q\\E".matches(Pattern.quote("\\Q\\E")) // true.
    • Nein:“\\Q”变成“\\Q\\Q\\E”,不是吗?
    • @Andrew 是的,但是正则表达式足够聪明,知道如何处理:引用的文本是从 \Q(专有)到下一个 \E(专有)的所有内容,其中可能包括任意数量的\Q 序列。
    【解决方案2】:

    Pattern.quote 方法引用正则表达式模式的一部分以使正则表达式将其解释为字符串文字。

    假设您的搜索程序中有一些用户输入,并且您想对其进行正则表达式。但是这个输入可能有不安全的字符,所以你可以使用

    Pattern pattern = Pattern.compile(Pattern.quote(userInput));
    

    此方法不引用 Pattern,但正如您所指出的,将 String 包含在正则表达式引号中。

    【讨论】:

      【解决方案3】:

      \Q\E 等都在java.util.regex.Pattern Javadoc 页面上进行了详细记录。它们的意思是“开始 Quote”、“End 引用”并划定一个所有字符都具有字面意义的区域。使用Pattern.quote 的返回值的方法是将其提供给Pattern.compile,或任何其他接受模式字符串的方法,例如String.split

      【讨论】:

        【解决方案4】:

        如果你编译Pattern.quote返回的字符串,你会得到一个Pattern,它与你quoted的文字字符串相匹配。

        \Q\E 标记字符串引用部分的开始和结束。

        【讨论】:

          【解决方案5】:

          正则表达式经常与普通字符串发生冲突。假设我想要一个正则表达式来搜索仅在运行时才知道的某个字符串。我们如何确定字符串没有正则表达式含义,例如(".*.*.*")?我们引用它。

          【讨论】:

          • 确实,一个这样的例子是当你想替换第一次出现的子字符串,但是当你想传递一个文字字符串时,String.replaceFirst 需要一个正则表达式。
          【解决方案6】:

          此方法用于将模式视为文字字符序列。 这与 PATTERN.LITERAL 标志的效果相同。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-11-20
            • 2013-12-09
            • 1970-01-01
            • 2010-12-13
            • 2017-01-29
            • 2010-10-27
            相关资源
            最近更新 更多