Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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字符串类中replaceAll()函数的内部工作_Java_Regex_String_Time Complexity_Replaceall - Fatal编程技术网

Java字符串类中replaceAll()函数的内部工作

Java字符串类中replaceAll()函数的内部工作,java,regex,string,time-complexity,replaceall,Java,Regex,String,Time Complexity,Replaceall,我访问了多个网站,只是为了了解String类中使用的任何regex函数的内部工作原理,如split()和replaceAll() 问题陈述可在此处获得: 我的代码: String s = "abaaccasdraaaadsfd"; s = s.replaceAll("(.)\\1{1,}", "$17$1"); String[] s2 = s.split("7"); int len = 0; for(String a

我访问了多个网站,只是为了了解String类中使用的任何regex函数的内部工作原理,如split()和replaceAll()

问题陈述可在此处获得:

我的代码:

String s = "abaaccasdraaaadsfd";
s = s.replaceAll("(.)\\1{1,}", "$17$1");
String[] s2 = s.split("7");
int len = 0;
for(String a : s2) {
    if(a.length() > len) {
        len = a.length();
    }
}
System.out.println(len);
网上通用代码:

String s = "abaaccasdraaaadsfd";
int count=0;
int max=0;
for(int i=1;i<str.length();i++){
    char ch =str.charAt(i-1);
    char ch1=str.charAt(i);
    if(ch!=ch1){
        count++;
        if(max<count){
            max=count;
        }
    }else{
        count=0;
    }
}
System.out.println(max+1);
String s=“abaaccasdraaaadsfd”;
整数计数=0;
int max=0;

for(inti=1;i正则表达式对于这种简单的分析来说太复杂了

有一种叫做Thompson/NFA正则表达式解析器的东西,这种正则表达式解析器有O(n+m)性能,其中n是regexp的长度,m是输入字符串的长度。但是,TNFAs无法处理反向引用、各种lookahead/lookback以及其他问题。一旦开始在regexp中使用这些“TNFA取消资格”功能,实际上不可能压缩o(n+m)regexp引擎的性能。这方面的证据相当简单。此regexp:

/^1?$| ^(11+?)\1+$/

将匹配长度为素数且仅由“1”符号组成的输入字符串。其他操作将失败

这个任务(检查素数)不能在O(n)中完成。因此,任何可以运行上述regexp的regexp解析器都不能是O(n+m),QED

现在,一个相关的问题是:如果输入regexp仅使用基本特性,例如可以由Thompson/NFA风格的状态机处理regexp,那么java是否会使用它,而不是使用简单的回溯实现

答案似乎与您的问题无关,因为您在这里使用的是回溯。但是,如果内存可用,java不会附带TNFA实现,并且将始终使用回溯器。但是,这并没有写入规范中,因此某些未来版本可能会根据中使用的功能智能地切换组件输入regexp.current(从JDK14开始)实现完全支持java.util.regexp.Pattern类的javadoc中解释的整个特性集(包括TNFA引擎无法实现的特性,如回溯),这确实意味着某些正则表达式在java的正则表达式引擎中比在Thompson/NFA引擎中花费更长的数量级

更多信息

。如果您希望java中有保证的线性性能(
O(n+m)
)正则表达式,请使用此选项。从数学上讲,re2j不支持反向引用和其他一些功能(请参阅网站的列表),因此它无法运行
()\\1{1,}
expression——这是因为从数学上讲,在
O(n)
时间内不可能做到这一点