使用Pattern.LITERAL是否与Pattern.quote相同?

时间:2011-01-29 22:39:34

标签: java regex

更准确地说:做

Pattern.compile(s, x | Pattern.LITERAL)

Pattern.compile(Pattern.quote(s), x)

为任何字符串s和任何其他标记x创建等效的正则表达式?

如果没有,如何模拟Pattern.LITERAL?

3 个答案:

答案 0 :(得分:3)

简短回答:对于你的例子,是的。

答案很长:是的,但Pattern.quote更灵活。如果您只想引用某些模式,该怎么办?像:

Pattern.compile(Pattern.quote(s) + "+", x)

通过设置Pattern.LITERAL标志,即使+字符现在也可以按字面意思处理。

如果您不信任该文档,可以在Google代码搜索Pattern.compile查看the source code将有所帮助。

从我可以从源代码中得到的结果:

  • 如果LITERAL标志设置为而不是,则无论其他所有标志如何,它都会查找任何\ Q ... \ E引用的块并手动转义特殊字符,就像人们会期待。

  • 如果设置了LITERAL标志,它将使用newSlice方法转换整个模式,并且至少有CASE_INSENSITIVE标志和UNICODE_CASE标志的特殊情况

答案 1 :(得分:1)

给出问题,答案是否定的,因为设置x = Pattern.LITERAL导致在第二个表达式中引用s两次。使用双引号和s="A"时,字符串"A"将不匹配,但字符串"\\QA\\E"将匹配。然而,

Pattern.compile(s, x | Pattern.LITERAL)

似乎等同于

Pattern.compile(Pattern.quote(s), x & ~Pattern.LITERAL)

答案 2 :(得分:0)

虽然我没有看到它的问题,但我不太相信将任意模式标志与整个模式引用的东西一起使用。 documentation提到它会渲染所有的旗帜,但毕竟是两个多余的旗帜。我认为它会没问题,但是给我染色méfiant - 不信任。

您是否尝试过将\Q … \E用于您希望引用非元模式的模式部分,可以这么说?

相关问题