Java正则表达式导致线程挂起

标签 java regex hung

模式:

"(([^",\n  ]*[,\n  ])*([^",\n  ]*"{2})*)*[^",\n  ]*"[  ]*,[  ]*|[^",\n]*[  ]*,[  ]*|"(([^",\n  ]*[,\n  ])*([^",\n  ]*"{2})*)*[^",\n  ]*"[  ]*|[^",\n]*[  ]*

此正则表达式用于解析 CSV 文件。但是当它进入 Pattern.matcher 时,我遇到了挂起线程异常。如果有人可以帮助微调此模式,我将不胜感激。

[7/1/13 16:45:26:745 GMT+08:00] 00000029 ThreadMonitor W   WSVR0605W: Thread "MessageListenerThreadPool : 0" (00000035) has been active for 691836 milliseconds and may be hung.  There is/are 1 thread(s) in total in the server that may be hung.
at java.util.regex.Pattern$Curly.match(Pattern.java:4233)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4606)
at java.util.regex.Pattern$Loop.matchInit(Pattern.java:4752)
at java.util.regex.Pattern$Prolog.match(Pattern.java:4689)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4606)
at java.util.regex.Pattern$Loop.match(Pattern.java:4733)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4665)
at java.util.regex.Pattern$Loop.matchInit(Pattern.java:4754)
at java.util.regex.Pattern$Prolog.match(Pattern.java:4689)
at java.util.regex.Pattern$Loop.match(Pattern.java:4742)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4665)
at java.util.regex.Pattern$BitClass.match(Pattern.java:2912)
at java.util.regex.Pattern$Curly.match0(Pattern.java:4278)
at java.util.regex.Pattern$Curly.match(Pattern.java:4233)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4606)
at java.util.regex.Pattern$Loop.matchInit(Pattern.java:4752)
at java.util.regex.Pattern$Prolog.match(Pattern.java:4689)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4606)

最佳答案

描述

问题似乎是为了完成匹配而进行的回溯的剪切量。

如果您的 CSV 格式良好,您可以使用更简单的正则表达式来解析每一行。请注意,这只会将引号逗号和逗号分隔值与字符串分开,因此您需要使用此正则表达式将每一行传递到 .matcher 并迭代每个匹配项。

正则表达式:(?:^|,)"?((?<=")[^"]*|[^,"]*)"?(?=,|$)

enter image description here

Java 代码示例:

实例:http://ideone.com/NBmzrk

示例文本

"root",test1,1111,"22,22",,fdsa

代码

import java.util.regex.Pattern;
import java.util.regex.Matcher;
class Module1{
  public static void main(String[] asd){
  String sourcestring = "source string to match with pattern";
  Pattern re = Pattern.compile("(?:^|,)\"?((?<=\")[^\"]*|[^,\"]*)\"?(?=,|$)",Pattern.CASE_INSENSITIVE);
  Matcher m = re.matcher(sourcestring);
  int mIdx = 0;
    while (m.find()){
      for( int groupIdx = 0; groupIdx < m.groupCount()+1; groupIdx++ ){
        System.out.println( "[" + mIdx + "][" + groupIdx + "] = " + m.group(groupIdx));
      }
      mIdx++;
    }
  }
}

捕获组 1

[0] => root
[1] => test1
[2] => 1111
[3] => 22,22
[4] => 
[5] => fdsa

关于Java正则表达式导致线程挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17431708/

相关文章:

c# - 从使用某些指定字符括起来的字符串中获取子字符串

Java Spring - 管理同步请求的线程

java - 如何使用 Java 在特定时间触发一个方法?

用于匹配和删除 URL 的 PHP Regex 或 DOMDocument?

python - 如何中断/停止/结束挂起的多线程 python 程序

php - 查找/处理停滞的 PHP 脚本

php - 如何检测 PHP CLI 脚本处于挂起状态

java方法重载: abnormal behaviour

java.awt.Robot.createScreenCapture 在最后一个 JRE (8) 的多屏幕配置上不起作用

Python 正则表达式解析字符串并返回元组