java正则表达式String.matches有BUG! string.matches("(.|\\s)*?测 试(.|\\s)*?");如果匹配的话,马上就有结果返回,反之,就死在那!string.indexof("测 试")>=0是不会有问题的 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 public static void main(String[] args) { String string = " 测 试 "; System.out.println(string.matches("(.|\\s)*?测 试(.|\\s)*?")); }我这里没有任何问题,你的jdk是不是该打补丁阿!我的是 1.6 最新的 你的string太简单了用下面的试试:%%mod nsr:d=k'9999999,p=0,ns=als-1;%%RETCODE = 7406 设定未完全成功,系统将自动进行重新设定联机设定结果------------ 模块 设定结果 32 设定成功 102 状态不正常 216 设定成功 217 设定成功(结果个数 = 4)--- END 你等吧,等足够的时间会出来的。唯一的解释,你的匹配结果太多了,如果你把"(.|\\s)*?测 试(.|\\s)*?"替换为".|\\s*?测 试.|\\s*?"也就是去掉那2对小括号速度就非常快了。 这个不是bug!楼主应该从计算复杂度上思考这个问题。你知道匹配"*"的实际操作是不断的回溯吗?这个计算复杂度是很大的。 这么说这个正则没有多少实用性了,还不如用字符函数,这个BUG真是害人不浅!不知道别的语言实现的正则有没有这个问题? 使用正则表达式的效率本身就比直接使用字符串方法的效率低,像这个完全可以采用indexOf方法。正则表达式主要完成一些较为复杂的模式匹配,就是采用基本的字符串方法不易实现的匹配。比如像E-mail验证,若采用字符串分析的话会是非常麻烦的,所以一般就采用正则表达式来做。想想可能大家对正则表达式的认识存在一定的误区了,当正则表达式是无所不能的了。像我在这里曾经看到过用正则表达式来匹配日期,这个也就算了,竟然还有要让正则表达式来匹配麻将糊牌什么的。像匹配日期这种,日期的算法本身就是很复杂,有闰年平年什么的,有得去写一个这样的正则表达式,还不如直接采用字符串分析来得快一些。 参照http://topic.csdn.net/u/20071214/17/ccc42222-6c64-4893-a191-d6f779d9067f.html 看来java的正则表达式还不成熟,不能商用! string.matches("(. ¦\\s)*?测 试(. ¦\\s)*?"); 返回false与string.matches("(. |\\s)*?测 试(. |\\s)*?"); 返回true看到什么不同了吧 ,lz写错了~ 靠,怎么发上来就变了string.matches("(.¦\\s)*?测 试(.¦\\s)*?"); //返回false string.matches("(.|\\s)*?测 试(.|\\s)*?"); //返回true ,匹配不到返回false(很快) 哎 总是有那么些个人说话不经过大脑动不动就说这个bug了那个bug了其实是你bug了 我看是CSDN的问题|和¦明显不一样,放在普通文本里就变成一样的 这是shan1119 提供的链接中的回复:找了很多网站,还有验证了好多次,终于发现原因: 能匹配空字符串的子匹配不要循环无限次。如果括号内的子表达式中的每一部分都可以匹配 0 次,而这个括号整体又可以匹配无限次,匹配过程中可能死循环。虽然现在有些正则表达式引擎已经通过办法避免了这种情况出现死循环了,比如 ,但是我们仍然应该尽量避免出现这种情况。如果我们在写表达式时遇到了死循环,也可以从这一点入手。 上面的正则表达式中刚好有这种情况出现,所以以后用到括号()的时候一定要注意。希望大家也能够提高警惕!在.NET的正则表达式不会出现问题,在Java中出现,这不是BUG吗? Java 抛出异常的问题 getElementById返回 null值 帮忙,java如何实现udp穿越nat HelpGUI 在非多线程条件下,ArrayList的效率比Vector到底好多少? 内部类的构造函数问题??请高人指点以下代码。 急问:如何判断给定的pathname中路径名是否存在?即如何判断文件夹是否存在呢? JAVA新手问一个问题! 有关jtable的问题 请问java中如何实现callback? 新手超级简单问题,白送分 java中往Access数据库里插入记录的问题
String string = " 测 试 ";
System.out.println(string.matches("(.|\\s)*?测 试(.|\\s)*?"));
}我这里没有任何问题,你的jdk是不是该打补丁阿!我的是 1.6 最新的
用下面的试试:
%%mod nsr:d=k'9999999,p=0,ns=als-1;%%
RETCODE = 7406 设定未完全成功,系统将自动进行重新设定联机设定结果
------------
模块 设定结果 32 设定成功
102 状态不正常
216 设定成功
217 设定成功
(结果个数 = 4)--- END
唯一的解释,你的匹配结果太多了,如果你把"(.|\\s)*?测 试(.|\\s)*?"替换为
".|\\s*?测 试.|\\s*?"
也就是去掉那2对小括号速度就非常快了。
不知道别的语言实现的正则有没有这个问题?
像这个完全可以采用indexOf方法。正则表达式主要完成一些较为复杂的模式匹配,就是采用基本
的字符串方法不易实现的匹配。比如像E-mail验证,若采用
字符串分析的话会是非常麻烦的,所以一般就采用正则表达式
来做。想想可能大家对正则表达式的认识存在一定的误区了,当正则
表达式是无所不能的了。像我在这里曾经看到过用正则表达式
来匹配日期,这个也就算了,竟然还有要让正则表达式来匹配
麻将糊牌什么的。像匹配日期这种,日期的算法本身就是很复
杂,有闰年平年什么的,有得去写一个这样的正则表达式,还
不如直接采用字符串分析来得快一些。
http://topic.csdn.net/u/20071214/17/ccc42222-6c64-4893-a191-d6f779d9067f.html
与
string.matches("(. |\\s)*?测 试(. |\\s)*?"); 返回true看到什么不同了吧 ,lz写错了~
string.matches("(.|\\s)*?测 试(.|\\s)*?"); //返回true ,匹配不到返回false(很快)
动不动就说这个bug了那个bug了
其实是你bug了
|和¦明显不一样,放在普通文本里就变成一样的
找了很多网站,还有验证了好多次,终于发现原因: 能匹配空字符串的子匹配不要循环无限次。如果括号内的子表达式中的每一部分都可以匹配 0 次,而这个括号整体又可以匹配无限次,匹配过程中可能死循环。虽然现在有些正则表达式引擎已经通过办法避免了这种情况出现死循环了,比如 ,但是我们仍然应该尽量避免出现这种情况。如果我们在写表达式时遇到了死循环,也可以从这一点入手。
上面的正则表达式中刚好有这种情况出现,所以以后用到括号()的时候一定要注意。希望大家也能够提高警惕!
在.NET的正则表达式不会出现问题,在Java中出现,这不是BUG吗?