【问题标题】:Java Regex - Conditional GroupingJava 正则表达式 - 条件分组
【发布时间】:2015-12-03 23:50:11
【问题描述】:

我需要在 2 组中解析以下行:
第 1 组:ADJ-1-37-10
第 2 组:3.00(如果没有 SPANLOSSMARGIN 标记,则应为空)

到目前为止,我使用"(ADJ-\d{1,3}-\d{1,3}-\d{1,3})::.*?SPANLOSSMARGIN=(\d{1,2}.\d{1,2}) 来解析以下行。但它与 ADJ-1-37-16 不匹配,因为该行不包含 SPANLOSSMARGIN 标记。我的要求是当有 ADJ-X-XX-XX 标签时(无论是否存在其他标签),那么第 1 组应该返回它,当有 SPANLOSSMARGIN 标签时,第 2 组应该返回它;但仅当没有 SPANLOSSMARGIN 标记时,第 2 组才应返回空。我怎样才能做到这一点?

“ADJ-1-2-5::FIBERTYPE=NDSF,OSCPANLOSS=16.00,TARGSPANLOSS=16.00,MINSPANLOSS=0.00,SPANLOSSMARGIN=3.00” “ADJ-1-13-5::FIBERTYPE=NDSF,OSCPANLOSS=16.00,TARGSPANLOSS=16.00,MINSPANLOSS=0.00,SPANLOSSMARGIN=3.00” ; "ADJ-1-37-2::FIBERTYPE=UNKNOWN,TARGSPANLOSS=0.00,MINSPANLOSS=0.00,SPANLOSSMARGIN=3.00,SPANLOSSSOURCE=UNKNOWN,BUNDLEID=\"\",LINEIN=\"\",LINEOUT=\"\" ,CRSIN=\"\",CRSOUT=\"\"" "ADJ-1-37-4::FIBERTYPE=UNKNOWN,TARGSPANLOSS=0.00,MINSPANLOSS=0.00,SPANLOSSMARGIN=3.00,SPANLOSSSOURCE=UNKNOWN,BUNDLEID=\"\",LINEIN=\"\",LINEOUT=\"\" ,CRSIN=\"\",CRSOUT=\"\"" "ADJ-1-37-8::FIBERTYPE=UNKNOWN,TARGSPANLOSS=0.00,MINSPANLOSS=0.00,SPANLOSSMARGIN=3.00,SPANLOSSSOURCE=UNKNOWN,BUNDLEID=\"\",LINEIN=\"\",LINEOUT=\"\" ,CRSIN=\"\",CRSOUT=\"\"" "ADJ-1-37-10::FIBERTYPE=UNKNOWN,TARGSPANLOSS=0.00,MINSPANLOSS=0.00,SPANLOSSMARGIN=3.00,SPANLOSSSOURCE=UNKNOWN,BUNDLEID=\"\",LINEIN=\"\",LINEOUT=\"\" ,CRSIN=\"\",CRSOUT=\"\"" "ADJ-1-37-14::FIBERTYPE=UNKNOWN,TARGSPANLOSS=0.00,MINSPANLOSS=0.00,SPANLOSSMARGIN=3.00,SPANLOSSSOURCE=UNKNOWN,BUNDLEID=\"\",LINEIN=\"\",LINEOUT=\"\" ,CRSIN=\"\",CRSOUT=\"\"" "ADJ-1-37-16::FIBERTYPE=UNKNOWN,TARGSPANLOSS=0.00,MINSPANLOSS=0.00,SPANLOSSSOURCE=UNKNOWN,BUNDLEID=\"\",LINEIN=\"\",LINEOUT=\"\",CRSIN=\ "\",CRSOUT=\"\"" "ADJ-1-37-20::FIBERTYPE=UNKNOWN,TARGSPANLOSS=0.00,MINSPANLOSS=0.00,SPANLOSSMARGIN=3.00,SPANLOSSSOURCE=UNKNOWN,BUNDLEID=\"\",LINEIN=\"\",LINEOUT=\"\" ,CRSIN=\"\",CRSOUT=\"\"" "ADJ-1-37-22::FIBERTYPE=UNKNOWN,TARGSPANLOSS=0.00,MINSPANLOSS=0.00,SPANLOSSMARGIN=3.00,SPANLOSSSOURCE=UNKNOWN,BUNDLEID=\"\",LINEIN=\"\",LINEOUT=\"\" ,CRSIN=\"\",CRSOUT=\"\""

【问题讨论】:

    标签: java regex regex-lookarounds


    【解决方案1】:

    试试这个:

    (ADJ-\d{1,3}-\d{1,3}-\d{1,3})::(.(SPANLOSSMARGIN=)?(\d{1,2}.\d{1,2})?)*

    你可以在这里试试:

    http://fiddle.re/qm6j86

    第 4 组是 SPANLOSSMARGIN= 的匹配项,如果 SPANLOSSMARGIN= 不存在,则第 3 组将是 null

    【讨论】:

    • 我不得不将其修改为 (ADJ-\d{1,3}-\d{1,3}-\d{1,3})::(.(SPANLOSSMARGIN=(\d{1,2}.\d{1,2}))?)*,因为即使没有 SPANLOSSMARGIN 标签,第 4 组也返回 0.00。好吗?
    • @surz 我在回答中说您需要检查第 3 组以查看是否匹配
    • 你说得对,我直接使用第 4 组,所以不得不稍微调整一下,你看到这个正则表达式有什么问题吗?
    • 你修改的那个我觉得不错
    猜你喜欢
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 2012-01-23
    • 2019-02-07
    • 2016-09-19
    • 2021-08-08
    相关资源
    最近更新 更多