Android:Matcher.find()永远不会返回

时间:2011-02-05 06:06:45

标签: java android

首先,这里有一大堆受影响的代码:

// (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错误吗?我一遍又一遍地尝试过,只是无法让它发挥作用。不知怎的,我觉得过去几天的事情打破了这个因为我的应用程序之前工作正常,而且我在过去的几天收到了一些应用程序无法正常工作的评论,因此它也明显影响了其他用户。

如何进一步调试?

4 个答案:

答案 0 :(得分:3)

某些正则表达式可能需要很长时间才能进行评估。特别是,具有大量量词的正则表达式可以使正则表达式引擎进行大量的回溯,以探索输入字符串可能匹配的所有可能方式。如果它失败了,它必须探索所有这些可能性。

(这是一个例子:

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

在确定输入字符串不匹配之前,典型的正则表达式引擎将在20^6字符比较区域中进行。)

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

答案 1 :(得分:2)

您要解析的字符串有多长? 你试图匹配的正则表达式有多长,多复杂?

您是否尝试将正则表达式分解为更简单的位?一个接一个地添加这些位将让你看到它何时中断,也许是为什么。

答案 2 :(得分:0)

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

请阅读我的blogpost on android validation了解详情。

答案 3 :(得分:0)

我遇到了同样的问题,我用.替换了所有野外图[\s\S]。我真的不知道为什么它对我有用,但确实如此。我来自Javascript世界,我知道那里的表达式被评估的速度更快。

相关问题