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

Java Android:Matcher.find()永远不会返回,java,android,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 = detai

首先,这里是一段受影响的代码:

// (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中的regex,因为它很长,但我知道它可以处理给定的数据集;或者如果它没有,它也不应该破坏任何东西

问题是,我确实收到了反馈I/Scraper23773:初始化模式和匹配器,数据长度18861,但我从未看到找到的?线路,它只是卡在查找电话上

这是一个已知的安卓bug吗?我试了一次又一次,但还是没能成功。不知何故,我认为过去几天的一些事情打破了这一局面,因为我的应用程序以前运行得很好,在过去几天里,我收到了一些关于该应用程序不工作的评论,因此它显然也影响了其他用户


我如何进一步调试它?

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


你试过把正则表达式分解成更简单的部分吗?一个接一个地累加这些位可以让您看到它何时中断,以及原因。

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

你试过把正则表达式分解成更简单的部分吗?一个接一个地累加这些位,可以让您看到它何时中断,以及原因。

使一些代码类似于[a-zA-Z]*将其作为参数传递给编译,这里的示例只允许使用小写和大写字符

阅读my以了解更多信息。

制作一些类似[a-zA-Z]*将其作为参数传递到编译,这里的示例只允许使用小写和大写字符


阅读my以了解更多信息。

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

以下是一个例子:

regex = "a*a*a*a*a*a*b";         // 6 quantifiers
input = "aaaaaaaaaaaaaaaaaaaa";  // 20 characters
典型的正则表达式引擎在确定输入字符串不匹配之前,将在20^6个字符的区域内进行比较


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

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

以下是一个例子:

regex = "a*a*a*a*a*a*b";         // 6 quantifiers
input = "aaaaaaaaaaaaaaaaaaaa";  // 20 characters
典型的正则表达式引擎在确定输入字符串不匹配之前,将在20^6个字符的区域内进行比较


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

我也遇到了同样的问题,我解决了它,替换了所有的wildchart。使用[\s\s]。我真的不知道为什么它对我有效,但它确实有效。我来自Javascript世界,在那里我知道表达式的计算速度更快。

我遇到了同样的问题,我解决了它,替换了所有的wildchart。使用[\s\s]。我真的不知道为什么它对我有效,但它确实有效。我来自Javascript世界,在那里我知道表达式的计算速度更快。

字符串长度约为18000-20000个字符。正则表达式可能会匹配其中大约500个字符。我仍然很困惑,为什么它过去能用,现在不行。数据字符串确实不同,所以我想知道它是否只是稍微长了一点,超过了某种限制;但是为什么find不抛出一个异常或做一些事情而不是挂起呢-\我刚刚把字符串缩短到16000个字符,它仍然挂起。现在,我想我会尝试通过移除正则表达式的片段来打破一些东西,看看它是否以某种方式被打破,即使它几天前还在工作!!嗯,正则表达式不匹配。我不知道为什么查找函数会挂起,这让我很担心,但现在我已经修复了正则表达式,它可以工作了。如果你找到一个原因,对你有好处。也许这只是因为regexp的复杂性和它匹配的数据位太多?字符串大约18000-20000个字符长。正则表达式可能会匹配其中大约500个字符。我仍然很困惑,为什么它过去能用,现在不行。数据字符串确实不同,所以我想知道它是否只是稍微长了一点,超过了某种限制;但是为什么find不抛出异常或者
不是挂着的东西吗-\我刚刚把字符串缩短到16000个字符,它仍然挂起。现在,我想我会尝试通过移除正则表达式的片段来打破一些东西,看看它是否以某种方式被打破,即使它几天前还在工作!!嗯,正则表达式不匹配。我不知道为什么查找函数会挂起,这让我很担心,但现在我已经修复了正则表达式,它可以工作了。如果你找到一个原因,对你有好处。也许这只是因为你的regexp的复杂性,它匹配了太多的数据位?嗨,Ricket,你介意分享你的解决方案吗?当正则表达式找不到任何匹配项时,我的代码也会挂起。顺便说一句,我的数据只有几百个字符长。@Zarah我的应用程序会刮取网络数据,而网页已经更改,所以我只是更新了它,以便它总是能再次找到数据。但是,我有大量的非贪婪搜索。*?我相信这些简单地扩展了find方法,花费了很长的时间,似乎是无限的。如果正则表达式可能不匹配,请确保尽可能对其进行优化。我不认为这里的问题是它挂起,只是它在每一个可能的排列中尝试正则表达式,即使是在一个小样本上也是很耗时的。当字符串不匹配时,我会得到完全相同的行为,并且应用程序在find方法启动后永远不会返回,我把电话放了好几个小时,它再也没有回来,这一定是个bug。我尝试匹配的正则表达式和字符串非常小,我的正则表达式是:^\w*\s**:字符串只有54个字符长,只有字母和这些符号:'and.Hi Ricket,您介意分享您的解决方案吗?当正则表达式找不到任何匹配项时,我的代码也会挂起。顺便说一句,我的数据只有几百个字符长。@Zarah我的应用程序会刮取网络数据,而网页已经更改,所以我只是更新了它,以便它总是能再次找到数据。但是,我有大量的非贪婪搜索。*?我相信这些简单地扩展了find方法,花费了很长的时间,似乎是无限的。如果正则表达式可能不匹配,请确保尽可能对其进行优化。我不认为这里的问题是它挂起,只是它在每一个可能的排列中尝试正则表达式,即使是在一个小样本上也是很耗时的。当字符串不匹配时,我会得到完全相同的行为,并且应用程序在find方法启动后永远不会返回,我把电话放了好几个小时,它再也没有回来,这一定是个bug。我试图匹配的正则表达式和字符串非常小,我的正则表达式是:^\w*\s**:字符串只有54个字符长,只有字母和这些符号:'and'。