JDK 1.8的java.util.regex.Pattern中的错误?

时间:2017-12-01 23:18:48

标签: java regex

我偶然想出了以下永远运行的程序,而不是打印出一个真/假的结果。那是一个错误吗?我承认运行时间(因为匹配算法的贪婪/不情愿/占有性)可能太长(而不是无限)。无论如何,我想提醒这个案例。

String str = "[EXCEPTION] org.jfree.chart.annotations.junit.CategoryTextAnnotationTests.testEquals(org.jfree.chart.annotations.junit.CategoryTextAnnotationTests) false java.lang.NullPointerException [STACKTRACE] org.jfree.chart.annotations.AbstractAnnotation.notifyListeners(AbstractAnnotation.java:145) org.jfree.chart.annotations.AbstractAnnotation.fireAnnotationChanged(AbstractAnnotation.java:129) org.jfree.chart.annotations.CategoryTextAnnotation.setCategoryAnchor(CategoryTextAnnotation.java:157) org.jfree.chart.annotations.junit.CategoryTextAnnotationTests.testEquals(CategoryTextAnnotationTests.java:101) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:606) junit.framework.TestCase.runTest(TestCase.java:176) junit.framework.TestCase.runBare(TestCase.java:141) junit.framework.TestResult$1.protect(TestResult.java:122) junit.framework.TestResult.runProtected(TestResult.java:142) junit.framework.TestResult.run(TestResult.java:125) junit.framework.TestCase.run(TestCase.java:129) junit.framework.TestSuite.runTest(TestSuite.java:252) junit.framework.TestSuite.run(TestSuite.java:247) org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:86) org.pitest.junit.adapter.CustomRunnerExecutor.run(CustomRunnerExecutor.java:42) org.pitest.junit.adapter.AdaptedJUnitTestUnit.execute(AdaptedJUnitTestUnit.java:85) org.pitest.mutationtest.execute.MutationTimeoutDecorator$1.run(MutationTimeoutDecorator.java:88) java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) java.util.concurrent.FutureTask.run(FutureTask.java:262) java.lang.Thread.run(Thread.java:745)\nsdas";
System.out.println(str.matches("\\[EXCEPTION\\] (.)* \\[STACKTRACE\\]( (.)*\\((.)*\\))*"));

最后但并非最不重要的是,请注意前缀“\ nsdas”会触发此行为。

1 个答案:

答案 0 :(得分:0)

  

这是一个错误吗?

我不这么认为。我认为这只是一个由设计不佳的正则表达式引起的指数回溯的一个例子。

问题在于这种模式。

  ( (.)*\\((.)*\\))*   

,特别是(.)*。它们将匹配任何字符序列,包括'('')'以及' ' 。如果您将其更改为[^() ]*,您应该会看到更好的效果。