Java字符串类中replaceAll()函数的内部工作
我访问了多个网站,只是为了了解String类中使用的任何regex函数的内部工作原理,如split()和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 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)
时间内不可能做到这一点