首先,这里有一大堆受影响的代码:
// (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 :(得分: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世界,我知道那里的表达式被评估的速度更快。