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

返されたMatchオブジェクトのSuccessプロパティの値を確認することで、入力文字列で正規表現パターンが見つかったかどうかを判断できます。一致が成功した場合、返されるMatchオブジェクトのValueプロパティには、正規表現パターンに一致する入力からの部分文字列が含まれます。一致するものが見つからない場合、その値はString.Emptyです。

http://msdn.microsoft.com/en-us/library/0z2heewz.aspxから

指定された値を使用して以下をテストすると、Successはtrueを返します。テキストを一致しない形式に変更すると、期待どおりにfalseが返されます。

var found = Regex.Match(inputString, pat).Success 
于 2012-06-19T02:27:45.610 に答える
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 に答える