为什么我的Android程序中出现PatternSyntaxException?

时间:2014-05-15 20:52:38

标签: java android regex exception

我有一个Java正则表达式Pattern,由一组字符串末尾的任何字符组成,并带有正面的后置。当我在Android之外使用1.6 JDK时,它编译并运行得很好但是当我将它放在我的Android应用程序的代码中时,它会抛出PatternSyntaxException。这是一行:

Pattern namePat = Pattern.compile("(?<=DISCOVERY,\\d,[0-9A-F]{12},\\d,[+-][\\d]{3},\\d,[\\d]{4})(.*)$");

以下是错误消息:

4784:D/com.example.MyTestApp.DiscoverThread( 4255): java.util.regex.PatternSyntaxException: Look-behind pattern matches must have a bounded maximum length near index 56:
4785:D/com.example.MyTestApp.DiscoverThread( 4255): (?<=DISCOVERY,\d,[0-9A-F]{12},\d,[+-][\d]{3},\d,[\d]{4})(.*)$
4786:D/com.example.MyTestApp.DiscoverThread( 4255):                                                         ^
4787:D/com.example.MyTestApp.DiscoverThread( 4255):     at java.util.regex.Pattern.compileImpl(Native Method)
4788:D/com.example.MyTestApp.DiscoverThread( 4255):     at java.util.regex.Pattern.compile(Pattern.java:411)
4789:D/com.example.MyTestApp.DiscoverThread( 4255):     at java.util.regex.Pattern.<init>(Pattern.java:394)
4790:D/com.example.MyTestApp.DiscoverThread( 4255):     at java.util.regex.Pattern.compile(Pattern.java:381)
4791:D/com.example.MyTestApp.DiscoverThread( 4255):     at com.example.MyTestApp.Parser$DiscoveryParser.<init>(Parser.java:146)
4792:D/com.example.MyTestApp.DiscoverThread( 4255):     at com.example.MyTestApp.DiscoverThread.run(DiscoverThread.java:61)
4793:D/com.example.MyTestApp.DiscoverThread( 4255):     at java.lang.Thread.run(Thread.java:841)

据我所知,后视镜的长度已完全指定。我错过了什么吗?该应用程序在Android 4.4.2设备上运行

1 个答案:

答案 0 :(得分:1)

错误在于你在(.*)的后视镜中有一个可变长度,这在技术上并不是你的后视镜的一部分。我猜想有一些奇怪的东西让它认为你的后视不是封闭的,(.*)是它的一部分,所以它不是固定长度的。

我会删除lookbehind,只依赖第一个捕获组:

DISCOVERY,\d,[0-9A-F]{12},\d,[+-][\d]{3},\d,[\d]{4}(.*)$