安卓可选单词边界正则表达式

6

我在针对Android平台2.2.3时遇到了正则表达式的问题。

下面的正则表达式在针对我的桌面上的Java虚拟机时可行,该正则表达式在.NET应用程序上也有效。

Pattern.compile("\\b?")

但是当我针对我的手机进行目标设置时,会出现PatternSyntaxException异常。有任何想法吗?

不知道错误的动机是什么...但这是一个可选的(然而零长度的)单词边界...毕竟你要匹配什么? - Gabber
这是来自另一个项目的相当复杂的正则表达式。但我不明白为什么可选的单词边界会成为无效的模式语法。 - Tentux
1个回答

4
我可以确认在Android模拟器中运行时会抛出PatternSyntaxException,但在常规Java应用程序中不会。我看不出为什么会这样,除了Android中使用的正则表达式实现与正常的Java SDK中不同之外。从Pattern Android开发者页面得知:

Android中使用的正则表达式实现是由ICU提供的。正则表达式的符号大多是其他Java语言实现中使用的符号的超集。这意味着现有的应用程序通常会按预期工作,但在罕见情况下,Android可能会接受其他实现不接受的正则表达式。

作为解决方法,我发现您可以通过将单词边界断言放在非捕获组中来避免异常。

Pattern.compile("(?:\\b)?");

使用捕获组同样可以,但我认为您并不需要它。

我建议您报告此问题作为错误,以查看是否可以获得官方回复。(我已经搜索过了,似乎还没有被报告。)


1
但要注意的是,这只是一个错误,因为Android拒绝了某些参考实现接受的正则表达式。包含一个零宽度断言,然后将其设为可选项完全没有意义。你是在说,“这个条件必须成立,但如果不成立也没关系”。通过拒绝它,编译器提醒了您是作者的打字错误或理解失败。 - Alan Moore
1
@AlanMoore 我试图想象出OP的正则表达式的其他部分,需要一个可选的单词边界是什么样子的,但我认为你是对的。这没有意义。使单词边界可选的方法就是根本不在正则表达式中包括它。 - Bill the Lizard
@BilltheLizard同意。我认为这没有意义。我不是原始正则表达式的作者。也许我误解了他们对“?”的使用,可能是捕获组的一部分。无论如何,我已经决定用自己的方式实现相同的解决方案。 - Tentux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接