Java 正则表达式 - 条件分组

Java Regex - Conditional Grouping

我需要分两组解析以下几行:
第 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 组应该 return 它,当有 SPANLOSSMARGIN 标签时,第 2 组应该 return 它;但只有当没有 SPANLOSSMARGIN 标签时,组 2 才应该 return 为空。我怎样才能做到这一点?

"ADJ-1-2-5::FIBERTYPE=NDSF,OSCSPANLOSS=16.00,TARGSPANLOSS=16.00,MINSPANLOSS=0.00,SPANLOSSMARGIN=3.00"
   "ADJ-1-13-5::FIBERTYPE=NDSF,OSCSPANLOSS=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=\"\""

试试这个:

(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