0

我有以下正则表达式字符串和下面的文本字符串。我有多个节点,我使用streamstreader. 之后,我尝试使用regex.match()匹配字符串进行匹配,当匹配时,即使有许多节点,它的运行速度也非常快。当没有匹配时,该regex.match()方法永远不会停止。

当字符串不匹配时,我的问题是,我只想捕获一个异常。例如,在下面的数据节点中,我们说某些字段完全丢失,在这种情况下我可以捕获异常,问题是如果节点格式不同,如何停止匹配例程?

string pat = @"TEST_REPLICATE\s*{\s*REPLICATE_ID\s*([^}]*?)\s+ASSAY_NUMBER\s*([^}]*?)\s+ASSAY_VERSION\s*([^}]*?)\s+DILUTION_ID\s*([^}]*?)\s+SAMPLE_ID\s*([^}]*?)\s+SAMPLE_TYPE\s*([^}]*?)\s+TEST_ORDER_DATE\s*([^}]*?)\s+TEST_ORDER_TIME\s*([^}]*?)\s+TEST_INITIATION_DATE\s*([^}]*?)\s+TEST_INITIATION_TIME\s*([^}]*?)\s+TEST_COMPLETION_DATE\s*([^}]*?)\s+TEST_COMPLETION_TIME\s*([^}]*?)\s+ASSAY_CALIBRATION_DATE\s*([^}]*?)\s+ASSAY_CALIBRATION_TIME\s*([^}]*?)\s+TRACK\s*([^}]*?)\s+PROCESSING_LANE\s*([^}]*?)\s+MODULE_SN\s*([^}]*?)\s+LOAD_LIST_NAME\s*([^}]*?)\s+OPERATOR_ID\s*([^}]*?)\s+DARK_SUBREADS\s*([^}]*?)\s+SIGNAL_SUBREADS\s*([^}]*?)\s+DARK_COUNT\s*([^}]*?)\s+SIGNAL_COUNT\s*([^}]*?)\s+CORRECTED_COUNT\s*([^}]*?)\s+STD_BAK\s*([^}]*?)\s+AVG_BAK\s*([^}]*?)\s+STD_FOR\s*([^}]*?)\s+AVG_FOR\s*([^}]*?)\s+SHAPE\s*([^}]*?)\s+EXCEPTION_STRING\s*([^}]*?)\s+RESULT\s*([^}]*?)\s+REPORTED_RESULT\s*([^}]*?)\s+REPORTED_RESULT_UNITS\s*([^}]*?)\s+REAGENT_MASTER_LOT\s*([^}]*?)\s+REAGENT_SERIAL_NUMBER\s*([^}]*?)\s+RESULT_FLAGS\s*([^}]*?)\s+RESULT_INTERPRETATION\s*([^}]*?)\s+DILUTION_PROTOCOL\s*([^}]*?)\s+RESULT_COMMENT\s*([^}]*?)\s+DATA_MANAGEMENT_FIELD_1\s*([^}]*?)\s+DATA_MANAGEMENT_FIELD_2\s*([^}]*?)\s+DATA_MANAGEMENT_FIELD_3\s*([^}]*?)\s+DATA_MANAGEMENT_FIELD_4\s*([^}]*?)\s*}";  



    TEST_REPLICATE
    {
        REPLICATE_ID            353
        ASSAY_NUMBER            34224
        ASSAY_VERSION           99
        ASSAY_STATUS            VALKID
        DILUTION_ID         1
        SAMPLE_ID           "NC_3e2e2"
        SAMPLE_TYPE         Specimen
        TEST_ORDER_DATE         05.21.2012
        TEST_ORDER_TIME         03:44:01
        TEST_INITIATION_DATE        05.21.2012
        TEST_INITIATION_TIME        04:03:36
        TEST_COMPLETION_DATE        05.21.2012
        TEST_COMPLETION_TIME        04:29:32
        ASSAY_CALIBRATION_DATE      NA
        ASSAY_CALIBRATION_TIME      NA
        TRACK           1
        PROCESSING_LANE     1
        MODULE_SN       "EP334545004"
        LOAD_LIST_NAME          C:\BSQ_SASDACC\ASDADAjson
        OPERATOR_ID         "Q_SI"
        DARK_SUBREADS           NA
        SIGNAL_SUBREADS         NA
        DARK_COUNT          NA
        SIGNAL_COUNT            NA
        CORRECTED_COUNT         NA
        STD_BAK             NA
        AVG_BAK             NA
        STD_FOR             NA
        AVG_FOR             NA
        SHAPE               NA
        EXCEPTION_STRING        Test execution was stopped.
        RESULT              NA
        REPORTED_RESULT         NA
        REPORTED_RESULT_UNITS       NA
        REAGENT_MASTER_LOT      ASDADA
        REAGENT_SERIAL_NUMBER       25022
        RESULT_FLAGS            NA
        RESULT_INTERPRETATION       NA
        DILUTION_PROTOCOL       ASDASD
        RESULT_COMMENT          ASDA ASDA1
        DATA_MANAGEMENT_FIELD_1     NA
        DATA_MANAGEMENT_FIELD_2     NA
        DATA_MANAGEMENT_FIELD_3     NA
        DATA_MANAGEMENT_FIELD_4     NA
    }
4

2 回答 2

0

三件事:

  1. 如果您编写这样的正则表达式,请使用选项RegexOptions.IgnorePatternWhitespace,它允许您在正则表达式中使用空格以使其更具可读性。这个空格不匹配!如果要匹配空格,则必须对其进行转义\或使用\s(您已经在做的事情)。

  2. 你不在.你的模式中使用 a ,所以不需要RegexOptions.Singleline. 此选项正在更改特殊字符的行为.,如果您不使用它,则不需要该选项。

  3. 如果您的模式失败,因为缺少某些关键字,您的正则表达式有一些使用 匹配的可能性[^}]*?,我会缩小范围以使用\S*\S匹配非空白字符(适用于您的示例,我看不到空格您要提取的数据),因此您的正则表达式应该会更快地失败。

    更新:我的错误,您的示例在某些时候有空格。然后我会\S*.*?. 由于我没有使用 Singleline 选项,因此这也不会匹配换行符,并且因为我使它变得不贪心,所以它不会在行尾包含空格。

    如果您可以选择缩小模式,这会更好。例如,如果您知道一个值只能是数字,则仅匹配\d+.

试试这个模式:

Regex r = new Regex(@"TEST_REPLICATE\s*
                         {\s*
                         REPLICATE_ID\s*(\S*)\s+
                         ASSAY_NUMBER\s*(\S*)\s+
                         ASSAY_VERSION\s*(\S*)\s+
                         DILUTION_ID\s*(\S*)\s+
                         SAMPLE_ID\s*(\S*)\s+
                         SAMPLE_TYPE\s*(\S*)\s+
                         TEST_ORDER_DATE\s*(\S*)\s+
                         TEST_ORDER_TIME\s*(\S*)\s+
                         TEST_INITIATION_DATE\s*(\S*)\s+
                         TEST_INITIATION_TIME\s*(\S*)\s+
                         TEST_COMPLETION_DATE\s*(\S*)\s+
                         TEST_COMPLETION_TIME\s*(\S*)\s+
                         ASSAY_CALIBRATION_DATE\s*(\S*)\s+
                         ASSAY_CALIBRATION_TIME\s*(\S*)\s+
                         TRACK\s*(\S*)\s+
                         PROCESSING_LANE\s*(\S*)\s+
                         MODULE_SN\s*(\S*)\s+
                         LOAD_LIST_NAME\s*(\S*)\s+
                         OPERATOR_ID\s*(\S*)\s+
                         DARK_SUBREADS\s*(\S*)\s+
                         SIGNAL_SUBREADS\s*(\S*)\s+
                         DARK_COUNT\s*(\S*)\s+
                         SIGNAL_COUNT\s*(\S*)\s+
                         CORRECTED_COUNT\s*(\S*)\s+
                         STD_BAK\s*(\S*)\s+
                         AVG_BAK\s*(\S*)\s+
                         STD_FOR\s*(\S*)\s+
                         AVG_FOR\s*(\S*)\s+
                         SHAPE\s*(\S*)\s+
                         EXCEPTION_STRING\s*(\S*)\s+
                         RESULT\s*(\S*)\s+
                         REPORTED_RESULT\s*(\S*)\s+
                         REPORTED_RESULT_UNITS\s*(\S*)\s+
                         REAGENT_MASTER_LOT\s*(\S*)\s+
                         REAGENT_SERIAL_NUMBER\s*(\S*)\s+
                         RESULT_FLAGS\s*(\S*)\s+
                         RESULT_INTERPRETATION\s*(\S*)\s+
                         DILUTION_PROTOCOL\s*(\S*)\s+
                         RESULT_COMMENT\s*(\S*)\s+
                         DATA_MANAGEMENT_FIELD_1\s*(\S*)\s+
                         DATA_MANAGEMENT_FIELD_2\s*(\S*)\s+
                         DATA_MANAGEMENT_FIELD_3\s*(\S*)\s+
                         DATA_MANAGEMENT_FIELD_4\s*(\S*)\s*
                         }"
     , RegexOptions.IgnorePatternWhitespace | RegexOptions.IgnoreCase);
于 2012-06-19T06:47:59.710 回答
0

您可以通过检查返回的 Match 对象的 Success 属性的值来确定是否在输入字符串中找到了正则表达式模式。如果匹配成功,则返回的 Match 对象的 Value 属性包含输入中与正则表达式模式匹配的子字符串。如果未找到匹配项,则其值为 String.Empty。

来自http://msdn.microsoft.com/en-us/library/0z2heewz.aspx

当我使用您提供的值测试以下内容时,成功返回 true。如果我将您的文本更改为不匹配的格式,它会按预期返回 false。

var found = Regex.Match(inputString, pat).Success 
于 2012-06-19T02:27:45.610 回答