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