正则表达式模式匹配超时

Regex pattern matching is getting timed out

我想使用 Pattern.split(String) api 根据正则表达式模式拆分输入字符串。正则表达式同时使用正负前瞻。正则表达式应该在分隔符 (,) 上拆分,如果分隔符包含在双引号 ("x,y") 中,则需要忽略分隔符。

正则表达式是 - (?<!(?<!\Q\E)\Q\E)\Q,\E(?=(?:[^\Q"\E]*(?<=\Q,\E)\Q"\E[[^\Q,\E|\Q"\E] | [\Q"\E]]+[^\Q"\E]*[^\Q\E]*[\Q"\E]*)*[^\Q"\E]*$)

此拆分调用超时的输入字符串是 -

"","1114356033020-0011,- [BRACKET],1114356033020-0017,- [FRAME],1114356033020-0019,- [CLIP],1114356033020-0001,- [FRAME ASSY],1114356033020-0013,- [GUSSET],1114356033020-0015,- [STIFFENER]","QH20426AD3 [RIVET,SOL FL HD],UY510AE3L [NUT,HEX],PO41071B0 [SEALING CMPD],LL510A3-10 [\"BOLT,HI-JOK\"]"

我读到查找技术很繁重,如果字符串太长可能会导致超时。如果我删除字符串末尾包围 [\"BOLT,HI-JOK\"] 的反斜杠,则正则表达式能够检测和拆分。

该模式也没有检测到上述字符串在 [STIFFENER]","QH20426AD3 处的第一个分隔符。但是,如果我删除字符串末尾包围 [\"BOLT,HI-JOK\"] 的反斜杠,则正则表达式能够检测到它。

我对正则表达式的查找不是很有经验,有人可以给我一些提示,告诉我如何优化这个正则表达式并避免超时吗? 任何指针,文章链接表示赞赏!

如果你想按逗号分割,后面的字符串是从双引号开始到结束:

,(?="[^"\]*(?:\.[^"\]*)*")

模式匹配:

  • , 匹配逗号
  • (?= 正面观察
    • "[^"\]* 匹配 " 和 0+ 次除 "\
    • 之外的任何字符
    • (?:\.[^"\]*)*" 可选择重复匹配 \ 以使用 . 转义任何字符,并再次匹配 "/[=41 以外的任何字符=]
  • ) 关闭前瞻

Regex demo | Java demo

String string = "\"\",\"1114356033020-0011,- [BRACKET],1114356033020-0017,- [FRAME],1114356033020-0019,- [CLIP],1114356033020-0001,- [FRAME ASSY],1114356033020-0013,- [GUSSET],1114356033020-0015,- [STIFFENER]\",\"QH20426AD3 [RIVET,SOL FL HD],UY510AE3L [NUT,HEX],PO41071B0 [SEALING CMPD],LL510A3-10 [\\"BOLT,HI-JOK\\"]\"\n";
String[] parts = string.split(",(?=\"[^\"\\]*(?:\\.[^\"\\]*)*\")");
for (String part : parts)
    System.out.println(part);

输出

""
"1114356033020-0011,- [BRACKET],1114356033020-0017,- [FRAME],1114356033020-0019,- [CLIP],1114356033020-0001,- [FRAME ASSY],1114356033020-0013,- [GUSSET],1114356033020-0015,- [STIFFENER]"
"QH20426AD3 [RIVET,SOL FL HD],UY510AE3L [NUT,HEX],PO41071B0 [SEALING CMPD],LL510A3-10 [\"BOLT,HI-JOK\"]"