Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#正则表达式回溯/_C#_Regex - Fatal编程技术网

C#正则表达式回溯/

C#正则表达式回溯/,c#,regex,C#,Regex,我有一个如下格式的字符串,当存在匹配项时,regex.macth静态方法运行得非常快。然而,经常会有一个字符串不匹配,我运行了一些场景,它进入回溯,regex.match似乎永远不会结束。这是一种特殊情况,当字段不整齐,并且某些字段不存在时。我必须使用正则表达式,不知道有没有人有什么建议?此外,我仅检索实例7的几个组值。 好的,我的数据如上所示,当它匹配示例时,它运行良好,例如100个这没有问题,我对此很满意,当格式可能不同时,例如某些字段(例如,最后四个字段)不存在,或者某些文件的顺序不同,在

我有一个如下格式的字符串,当存在匹配项时,regex.macth静态方法运行得非常快。然而,经常会有一个字符串不匹配,我运行了一些场景,它进入回溯,regex.match似乎永远不会结束。这是一种特殊情况,当字段不整齐,并且某些字段不存在时。我必须使用正则表达式,不知道有没有人有什么建议?此外,我仅检索实例7的几个组值。
好的,我的数据如上所示,当它匹配示例时,它运行良好,例如100个这没有问题,我对此很满意,当格式可能不同时,例如某些字段(例如,最后四个字段)不存在,或者某些文件的顺序不同,在这个正则表达式中,match只会永远运行。在这种情况下,如果格式不是我的静态字符串,我只想结束该过程。

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

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

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

我没有你的数据可以用来测试故障

更新

谢谢你的样品,我现在看到问题了。基本上,正则表达式具有可选匹配的重叠集。这是子表达式
\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*}
用组号展开:
(这看起来可能有点痛苦)


我放置了一个示例数据节点,我正在尝试使用[^}]*?看看这是否有区别。塔恩克斯已经不情愿了;通过将其更改为
[^}]*?+
,您是否也在试图使其具有所有格?即使.NET支持所有格量词,这也行不通。不幸的是,你必须坚持使用原子团。
     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*}