更准确地说:做
Pattern.compile(s, x | Pattern.LITERAL)
和
Pattern.compile(Pattern.quote(s), x)
为任何字符串s
和任何其他标记x
创建等效的正则表达式?
如果没有,如何模拟Pattern.LITERAL?
答案 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
用于您希望引用非元模式的模式部分,可以这么说?