C#Regex后退跟踪/

时间:2012-06-18 22:25:25

标签: c# regex

我有一个字符串,格式如下,当匹配时,regex.macth静态方法运行得非常快。但是通常有时会出现一个不匹配的字符串,而我正在运行一些场景,它会进入回溯状态,而regex.match似乎永远不会结束。当字段不按顺序而某些字段不存在时的特定情况。我必须使用正则表达式,并想知道是否有人有任何提示?此外,我只检索实例7的几个组值。 好吧我的数据看起来像上面那样,当它匹配exaclty它运行正常,例如100这个没问题,我很满意,当格式可能不同,例如一些字段,例如最后四个字段不是那个或者一些文件被命令不同,在这个regex.match中只是永远运行。在这种情况下,如果格式不是我的静态字符串,我只想结束该过程。

2 个答案:

答案 0 :(得分:1)

您可以尝试使用以下内容匹配各个字段名称和值:

(\w+)\s+([^}\s]*)

将它们收集到Dictionary中,然后从中开始工作。

答案 1 :(得分:0)

我没有你可以测试失败的数据。

更新

感谢您的示例,我现在看到了问题。基本上,正则表达式具有可选匹配的重叠集。这是子表达式\s*([^}]*?)。当这些重叠的角色类组合在一起时,它可能是灾难性回溯的重复。在这种情况下,正则表达式充斥着空格引用。

解决方案是当可选部件无法从回溯中受益(但只会伤害它)时,强制某些部件不会返回到回溯器。使段原子化具有使其成为文字的影响。在这种情况下,修剪部分会导致问题,将它们从回溯中移除并解决问题。

但是,为了正确修剪,需要改变\ s *表达式。

@Alan Moore提到.NET中没有积极的量词 他是对的,所以请使用下面的“Atomic Grouping”正则表达式。

Atomic Grouping版本:

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*}