我有一个格式如下的字符串,当匹配时,regex.macth 静态方法运行得非常快。然而,有时会有一个不匹配的字符串,我正在运行一些场景,它进入回溯并且 regex.match 似乎永远不会结束。当字段不按顺序并且某些字段不存在时的特定情况。我必须使用正则表达式,想知道是否有人有任何提示?此外,我只检索几个组值,例如 7。好吧,我的数据看起来像上面那样,当它匹配 exaclty 时它运行良好,例如 10000 没有问题,我对此感到满意,当格式可能不同时例如,某些字段(例如最后四个字段)不存在,或者某些字段的排序不同,在此 regex.match 中将永远运行。
问问题
299 次
2 回答
1
您可以尝试使用以下内容匹配各个字段名称和值:
(\w+)\s+([^}\s]*)
将它们收集到一个Dictionary
然后从中工作。
于 2012-06-18T22:35:07.823 回答
0
我没有可以测试失败的数据。
更新
感谢您的示例,我现在看到了问题。基本上,正则表达式具有可选匹配的重叠集。这是子表达式\s*([^}]*?)
。当像这样的重叠字符类组合在一起时,它可能会导致灾难性的回溯。在这种情况下,正则表达式充满了空白引用。
解决方案是当可选部分不能从回溯中受益(但只会伤害它)时,强制某些部分不返回给回溯器。使节原子化具有使其成为文字的效果。在这种情况下,修剪部分会导致问题,将它们从回溯中删除并解决问题。
但是,为了正确修剪,需要更改 \s* 表达式。
@Alan Moore 提到 .NET 中没有占有量词。
他是对的,所以使用下面的“原子分组”正则表达式。
原子分组版本:
TEST_REPLICATE\s*{\s*REPLICATE_ID(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*ASSAY_NUMBER(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*ASSAY_VERSION(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*DILUTION_ID(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*SAMPLE_ID(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*SAMPLE_TYPE(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*TEST_ORDER_DATE(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*TEST_ORDER_TIME(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*TEST_INITIATION_DATE(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*TEST_INITIATION_TIME(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*TEST_COMPLETION_DATE(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*TEST_COMPLETION_TIME(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*ASSAY_CALIBRATION_DATE(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*ASSAY_CALIBRATION_TIME(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*TRACK(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*PROCESSING_LANE(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*MODULE_SN(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*LOAD_LIST_NAME(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*OPERATOR_ID(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*DARK_SUBREADS(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*SIGNAL_SUBREADS(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*DARK_COUNT(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*SIGNAL_COUNT(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*CORRECTED_COUNT(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*STD_BAK(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*AVG_BAK(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*STD_FOR(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*AVG_FOR(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*SHAPE(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*EXCEPTION_STRING(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*RESULT(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*REPORTED_RESULT(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*REPORTED_RESULT_UNITS(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*REAGENT_MASTER_LOT(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*REAGENT_SERIAL_NUMBER(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*RESULT_FLAGS(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*RESULT_INTERPRETATION(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*DILUTION_PROTOCOL(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*RESULT_COMMENT(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*DATA_MANAGEMENT_FIELD_1(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*DATA_MANAGEMENT_FIELD_2(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*DATA_MANAGEMENT_FIELD_3(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*DATA_MANAGEMENT_FIELD_4(?>[^\S\n]*)([^}\n]*?)(?>[^\S\n]*)\s*}
所有格量词版本:
TEST_REPLICATE\s*{\s*REPLICATE_ID[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*ASSAY_NUMBER[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*ASSAY_VERSION[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*DILUTION_ID[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*SAMPLE_ID[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*SAMPLE_TYPE[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*TEST_ORDER_DATE[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*TEST_ORDER_TIME[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*TEST_INITIATION_DATE[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*TEST_INITIATION_TIME[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*TEST_COMPLETION_DATE[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*TEST_COMPLETION_TIME[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*ASSAY_CALIBRATION_DATE[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*ASSAY_CALIBRATION_TIME[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*TRACK[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*PROCESSING_LANE[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*MODULE_SN[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*LOAD_LIST_NAME[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*OPERATOR_ID[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*DARK_SUBREADS[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*SIGNAL_SUBREADS[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*DARK_COUNT[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*SIGNAL_COUNT[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*CORRECTED_COUNT[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*STD_BAK[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*AVG_BAK[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*STD_FOR[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*AVG_FOR[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*SHAPE[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*EXCEPTION_STRING[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*RESULT[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*REPORTED_RESULT[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*REPORTED_RESULT_UNITS[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*REAGENT_MASTER_LOT[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*REAGENT_SERIAL_NUMBER[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*RESULT_FLAGS[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*RESULT_INTERPRETATION[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*DILUTION_PROTOCOL[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*RESULT_COMMENT[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*DATA_MANAGEMENT_FIELD_1[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*DATA_MANAGEMENT_FIELD_2[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*DATA_MANAGEMENT_FIELD_3[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*DATA_MANAGEMENT_FIELD_4[^\S\n]*+([^}\n]*?)[^\S\n]*+\s*}
用组号扩展:(
这看起来可能有点痛苦)
TEST_REPLICATE\s*
{\s*
REPLICATE_ID
(?> [^\S\n]* )
1 ( [^}\n]*? )
(?> [^\S\n]* )
\s*ASSAY_NUMBER
(?> [^\S\n]* )
2 ( [^}\n]*? )
(?> [^\S\n]* )
\s*ASSAY_VERSION
(?> [^\S\n]* )
3 ( [^}\n]*? )
(?> [^\S\n]* )
\s*DILUTION_ID
(?> [^\S\n]* )
4 ( [^}\n]*? )
(?> [^\S\n]* )
\s*SAMPLE_ID
(?> [^\S\n]* )
5 ( [^}\n]*? )
(?> [^\S\n]* )
\s*SAMPLE_TYPE
(?> [^\S\n]* )
6 ( [^}\n]*? )
(?> [^\S\n]* )
\s*TEST_ORDER_DATE
(?> [^\S\n]* )
7 ( [^}\n]*? )
(?> [^\S\n]* )
\s*TEST_ORDER_TIME
(?> [^\S\n]* )
8 ( [^}\n]*? )
(?> [^\S\n]* )
\s*TEST_INITIATION_DATE
(?> [^\S\n]* )
9 ( [^}\n]*? )
(?> [^\S\n]* )
\s*TEST_INITIATION_TIME
(?> [^\S\n]* )
10 ( [^}\n]*? )
(?> [^\S\n]* )
\s*TEST_COMPLETION_DATE
(?> [^\S\n]* )
11 ( [^}\n]*? )
(?> [^\S\n]* )
\s*TEST_COMPLETION_TIME
(?> [^\S\n]* )
12 ( [^}\n]*? )
(?> [^\S\n]* )
\s*ASSAY_CALIBRATION_DATE
(?> [^\S\n]* )
13 ( [^}\n]*? )
(?> [^\S\n]* )
\s*ASSAY_CALIBRATION_TIME
(?> [^\S\n]* )
14 ( [^}\n]*? )
(?> [^\S\n]* )
\s*TRACK
(?> [^\S\n]* )
15 ( [^}\n]*? )
(?> [^\S\n]* )
\s*PROCESSING_LANE
(?> [^\S\n]* )
16 ( [^}\n]*? )
(?> [^\S\n]* )
\s*MODULE_SN
(?> [^\S\n]* )
17 ( [^}\n]*? )
(?> [^\S\n]* )
\s*LOAD_LIST_NAME
(?> [^\S\n]* )
18 ( [^}\n]*? )
(?> [^\S\n]* )
\s*OPERATOR_ID
(?> [^\S\n]* )
19 ( [^}\n]*? )
(?> [^\S\n]* )
\s*DARK_SUBREADS
(?> [^\S\n]* )
20 ( [^}\n]*? )
(?> [^\S\n]* )
\s*SIGNAL_SUBREADS
(?> [^\S\n]* )
21 ( [^}\n]*? )
(?> [^\S\n]* )
\s*DARK_COUNT
(?> [^\S\n]* )
22 ( [^}\n]*? )
(?> [^\S\n]* )
\s*SIGNAL_COUNT
(?> [^\S\n]* )
23 ( [^}\n]*? )
(?> [^\S\n]* )
\s*CORRECTED_COUNT
(?> [^\S\n]* )
24 ( [^}\n]*? )
(?> [^\S\n]* )
\s*STD_BAK
(?> [^\S\n]* )
25 ( [^}\n]*? )
(?> [^\S\n]* )
\s*AVG_BAK
(?> [^\S\n]* )
26 ( [^}\n]*? )
(?> [^\S\n]* )
\s*STD_FOR
(?> [^\S\n]* )
27 ( [^}\n]*? )
(?> [^\S\n]* )
\s*AVG_FOR
(?> [^\S\n]* )
28 ( [^}\n]*? )
(?> [^\S\n]* )
\s*SHAPE
(?> [^\S\n]* )
29 ( [^}\n]*? )
(?> [^\S\n]* )
\s*EXCEPTION_STRING
(?> [^\S\n]* )
30 ( [^}\n]*? )
(?> [^\S\n]* )
\s*RESULT
(?> [^\S\n]* )
31 ( [^}\n]*? )
(?> [^\S\n]* )
\s*REPORTED_RESULT
(?> [^\S\n]* )
32 ( [^}\n]*? )
(?> [^\S\n]* )
\s*REPORTED_RESULT_UNITS
(?> [^\S\n]* )
33 ( [^}\n]*? )
(?> [^\S\n]* )
\s*REAGENT_MASTER_LOT
(?> [^\S\n]* )
34 ( [^}\n]*? )
(?> [^\S\n]* )
\s*REAGENT_SERIAL_NUMBER
(?> [^\S\n]* )
35 ( [^}\n]*? )
(?> [^\S\n]* )
\s*RESULT_FLAGS
(?> [^\S\n]* )
36 ( [^}\n]*? )
(?> [^\S\n]* )
\s*RESULT_INTERPRETATION
(?> [^\S\n]* )
37 ( [^}\n]*? )
(?> [^\S\n]* )
\s*DILUTION_PROTOCOL
(?> [^\S\n]* )
38 ( [^}\n]*? )
(?> [^\S\n]* )
\s*RESULT_COMMENT
(?> [^\S\n]* )
39 ( [^}\n]*? )
(?> [^\S\n]* )
\s*DATA_MANAGEMENT_FIELD_1
(?> [^\S\n]* )
40 ( [^}\n]*? )
(?> [^\S\n]* )
\s*DATA_MANAGEMENT_FIELD_2
(?> [^\S\n]* )
41 ( [^}\n]*? )
(?> [^\S\n]* )
\s*DATA_MANAGEMENT_FIELD_3
(?> [^\S\n]* )
42 ( [^}\n]*? )
(?> [^\S\n]* )
\s*DATA_MANAGEMENT_FIELD_4
(?> [^\S\n]* )
43 ( [^}\n]*? )
(?> [^\S\n]* )
\s*}
于 2012-06-18T23:35:01.687 回答