【问题标题】:Regex pattern matching is getting timed out正则表达式模式匹配超时
【发布时间】:2021-09-26 20:15:04
【问题描述】:

我想使用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\"] 的反斜杠,那么正则表达式就能够检测到它。

我对正则表达式中的查找不是很有经验,有人可以提供有关如何优化此正则表达式并避免超时的提示吗? 任何指针,文章链接表示赞赏!

【问题讨论】:

    标签: java regex pattern-matching regex-lookarounds regex-greedy


    【解决方案1】:

    如果你想用逗号分割,后面的字符串是从开头到结尾的双引号:

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

    模式匹配:

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

    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\"]"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-06
      • 2016-04-20
      • 2014-09-15
      • 2016-04-24
      相关资源
      最近更新 更多