更确切地说:不要使用Pattern.LITERAL是否与Pattern.quote相同?
Pattern.compile(s, x | Pattern.LITERAL)
和
Pattern.compile(Pattern.quote(s), x)
任何字符串s
和任何其他标志x
创造相当于正则表达式?
如果没有,如何模拟Pattern.LITERAL?
更确切地说:不要使用Pattern.LITERAL是否与Pattern.quote相同?
Pattern.compile(s, x | Pattern.LITERAL)
和
Pattern.compile(Pattern.quote(s), x)
任何字符串s
和任何其他标志x
创造相当于正则表达式?
如果没有,如何模拟Pattern.LITERAL?
鉴于问题的是,答案是否定的,因为设置x = Pattern.LITERAL导致在第二个表达式中引用s
两次。用双引号和s="A"
字符串"A"
将不匹配,但字符串"\\QA\\E"
将。然而,
Pattern.compile(s, x | Pattern.LITERAL)
似乎等同于
Pattern.compile(Pattern.quote(s), x & ~Pattern.LITERAL)
尽管我没有看到它的问题,但我并不相信将任意模式标志与整个模式引用的东西一起使用。 documentation提到它会渲染所有的标志,但最终会有两个多余的标志。我认为这将是好的,但颜色我méfiant - 不信任。
您是否尝试过使用\Q … \E
来模拟那些您希望引用非元元素的部分,可以这么说?
简答:对于你的例子,是的。
长答案:是的,但是Pattern.quote更加灵活。如果你只想要一些引用你的模式呢?像:
Pattern.compile(Pattern.quote(s) + "+", x)
除了设置Pattern.LITERAL标志,甚至+
字符现在将字面上处理。
如果您不信任该文档,可能会在Google Code Search上搜索the source code以获得Pattern.compile
帮助。
从我可以从查看源代码获得:
如果文字标志不集,不顾一切其他标志,它会寻找任何\ Q ... \ E引用块并手动转义特殊字符,就像人们所期望的那样。
如果文字标志设置,将整个模式使用newSlice方法进行转换,并有特殊情况,至少在CASE_INSENSITIVE
标志和UNICODE_CASE
标志
你说“是”,但没有理由。我知道灵活性。 – maaartinus 2011-01-29 23:20:18
我读过的文档两次,现在还不清楚。这两个描述相似但不完全相同,OTOH,我没有看到真正的区别。在引用文档中,他们写道“好像它是一个字面模式”,并且没有关于案例的任何内容。我知道\ Q .. \ E,这就是Pattern.quote实际工作的方式。 – maaartinus 2011-01-29 23:18:28