2011-02-05 226 views
1

首先,这里是受影响的代码块:安卓:Matcher.find()永远不会返回

// (somewhere above, data is initialized as a String with a value) 
Pattern detailsPattern = Pattern.compile("**this is a valid regex, omitted due to length**", Pattern.DOTALL | Pattern.CASE_INSENSITIVE); 
Matcher detailsMatcher = detailsPattern.matcher(data); 
Log.i("Scraper", "Initialized pattern and matcher, data length "+data.length()); 
boolean found = detailsMatcher.find(); 
Log.i("Scraper", "Found? "+((found)?"yep":"nope")); 

我省略了正则表达式中Pattern.compile,因为它是很长,但我知道它的工作原理与给定的数据集;或者如果没有,反正它不会破坏任何东西。

问题是,我收到反馈I/Scraper(23773): Initialized pattern and matcher, data length 18861但我从来没有看到“发现?”行,它只是卡在拨打find()

这是一个已知的Android错误?我一遍又一遍地尝试过,只是无法让它工作。不知何故,我认为过去几天有些事情因为我的应用程序以前工作正常而被打破,而且我在过去几天收到了该应用程序无法正常工作的几条评论,因此它也明显影响了其他用户。

我该如何进一步调试呢?

+0

嗨Ricket,你介意分享你的解决方案吗?当正则表达式找不到任何匹配时,我的代码也会挂起。我的数据只有几百个字符长,顺便说一句。 – Zarah 2011-03-08 07:53:02

+0

@Zarah我的应用程序刮擦网页数据,网页已经改变,所以我只是更新它,以便它总是再次找到数据。然而,我有大量的非贪婪搜索(`。*?`),我相信那些简单地扩展find()方法需要很长时间(看起来是无限的)。如果正则表达式有可能不匹配,请确保它尽可能优化。我认为这里的问题不是它挂起,而是它试图在每个排列中使用正则表达式,即使在一个小样本上也很耗时。 – Ricket 2011-03-08 13:36:32

回答

2

您试图解析的字符串有多长? 正在尝试匹配的正则表达式有多长和多复杂?

您是否试图将您的正则表达式分解为更简单的位?一个接一个地添加位会让你看到它什么时候崩溃,也许是为什么。

0

使一些RE像[a-zA-Z] *将它作为参数传递给compile(),这里这个例子只允许字符小的& cap。

阅读我的blogpost on android validation了解更多信息。

2

有些正则表达式可能需要非常非常长的时间来评估。特别是,有很多量词的正则表达式可能会导致正则表达式引擎执行大量的回溯来探索输入字符串可能匹配的所有可能方式。如果它失败了,它必须探索所有这些可能性。

(这里有一个例子:

regex = "a*a*a*a*a*a*b";   // 6 quantifiers 
input = "aaaaaaaaaaaaaaaaaaaa"; // 20 characters 

一个典型的正则表达式引擎将在20^6字符比较的区域做决定,输入字符串不匹配了。)

如果您向我们展示了正则表达式和你想匹配的字符串,我们可以给出更好的诊断,并可能提供一些替代方案。但是,如果您试图从HTML中提取信息,那么最好的解决方案可能是根本不使用正则表达式。有HTML解析器专门用于处理现实世界的HTML。

0

我有同样的问题,我解决了它取代所有的wildchart .[\s\S]。我真的不知道为什么它为我工作,但它确实。我来自Javascript世界,我知道在那里表达式被评估更快。

相关问题