Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 非常缓慢地向后看_Java_Regex_Performance_Scala - Fatal编程技术网

Java 非常缓慢地向后看

Java 非常缓慢地向后看,java,regex,performance,scala,Java,Regex,Performance,Scala,我正在尝试使用java正则表达式恢复两个位置 第一个由正则表达式给出: val r="""(?=(?<=[ ]|^)[^ ]{1,21474836}(?=[ ]|$)(?<=[^A-Z]|^)[A-Z]{1,21474836}(?=[^A-Z]|$))""" 我想知道这个正则表达式什么时候可以在给定位置的左边找到,或者什么时候可以结束。 如果我有以下数据和以下位置: abc145A 0123456 我希望前面表达式的结尾与位置1、2、3、4、5和6匹配。如果我使用非贪婪的重复小丑

我正在尝试使用java正则表达式恢复两个位置

第一个由正则表达式给出:

val r="""(?=(?<=[ ]|^)[^ ]{1,21474836}(?=[ ]|$)(?<=[^A-Z]|^)[A-Z]{1,21474836}(?=[^A-Z]|$))"""
我想知道这个正则表达式什么时候可以在给定位置的左边找到,或者什么时候可以结束。 如果我有以下数据和以下位置:

abc145A
0123456

我希望前面表达式的结尾与位置1、2、3、4、5和6匹配。如果我使用非贪婪的重复小丑,那么它将匹配1、3和5。如果我使用贪婪运算符,它只匹配6。这就是为什么我需要查看断言背后的内容。或者,您将找到一种方法来定义运算符以查找我要查找的位置。

您没有使用嵌套的量词,但我怀疑嵌套的lookbehind会导致类似的问题。我怀疑您根本不需要外部的lookahead/lookahead-只使用正则表达式的内部部分(两者通用)执行单个正则表达式搜索怎么样,从每个结果中同时检索起始位置和结束位置?

我猜双重查找会导致它重复循环相同的字符-花费O(n^2)时间而不是O(n)时间。另一种可能性:{121474836}是一个非常非常大的范围,包含它的lookback所花费的时间可能与这个范围的大小成正比。我试图将这个数字降低到2000,但它没有改变任何事情。如果你将它降低到10呢?(Java可能会自动将其减少到搜索字符串的长度。)将其减少到10会将速度提高4倍。我之前已经尝试过这种方法,但它并不适用于所有情况。实际上,如果我使用一个表达式,它可能会匹配太长的标记,并且会隐藏标记的另一个外观。您可以通过在循环中一次搜索一个匹配,而不是通过一个方法调用搜索所有匹配来绕过这一点。或者,您可以将一个组放在第一个正则表达式中(在“[^]{121474836}”周围放上括号),并使用其长度确定结束位置。
r.findAllMatchIn("a <b/>"*100) //.... some long string of size 600...
p.findAllMatchIn("a <b/>"*100) //.... some long string of size 600...
[^ ]+[^.]+
abc145A
0123456