0

我有一个格式如下的字符串,当匹配时,regex.macth 静态方法运行得非常快。然而,有时会有一个不匹配的字符串,我正在运行一些场景,它进入回溯并且 regex.match 似乎永远不会结束。当字段不按顺序并且某些字段不存在时的特定情况。我必须使用正则表达式,想知道是否有人有任何提示?此外,我只检索几个组值,例如 7。好吧,我的数据看起来像上面那样,当它匹配 exaclty 时它运行良好,例如 10000 没有问题,我对此感到满意,当格式可能不同时例如,某些字段(例如最后四个字段)不存在,或者某些字段的排序不同,在此 regex.match 中将永远运行。

4

2 回答 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 回答