1

初めてのポスター、長年のユーザー。この正規表現を使用したこのデータが失敗するはずのときに、なぜこのデータが通過するのかわかりません。簡単な概要は、パイプで区切られたデータを含むテキスト ファイルがあることです。各行を一度に 1 つずつ読み取り、合格/不合格の正規表現と比較しています。

問題のデータは次のとおりです。

|A|00032004|00032004|25 S Kings Highway||Cape Giradeau|MO|63701|345800886888|0000254575|091091|RGT Foods, Inc.|1|345800886888|1|345800886888|1|601103061404806|1|003241699917|0|000000000000|0|000000000000|0|000000000000|0|000000000000|
|A|00032005|00032005|1009 Kings Hwy||Rolla |MO|65401|345800885880|0000254564||RGT Foods, Inc.|1|345800885880|1|345800885880|1|601103061404798|1|003241699925|0|000000000000|0|000000000000|0|000000000000|0|000000000000|

基本的な内訳は次のとおりです: |D、U、または A|ID#|ID#|St Add1|St Add2|City|ST|Zip|#|#|Name|bool|#|bool|#|bool|#|bool |#|ブール|#|ブール|#|ブール|#|ブール|#|

これは私の正規表現です (警告: ちょっと長いです):

^[\|]{1}[DUA]{1}[\|]{1}[0-9,A-Z]{8}[\|]{1}[0-9,A-Z]{8}[\|]{1}.{0,25}[\|]{1}.{0,25}[\|]{1}.{0,25}[\|]{1}[A-Z,a-z]{2}[\|]{1}[0-9]{5}[\|]{1}[A-Z,a-z,0-9]{12}[\|]{1}[A-Z,a-z,0-9]{10}[\|]{1}.{0,25}[\|]{1}[0,1]{1}[\|]{1}[0-9]{12}[\|]{1}[0,1]{1}[\|]{1}[0-9]{12}[\|]{1}[0,1]{1}[\|]{1}[0-9]{15}[\|]{1}[0,1]{1}[\|]{1}[0-9]{12}[\|]{1}[0,1]{1}[\|]{1}[0-9]{12}[\|]{1}[0,1]{1}[\|]{1}[0-9]{12}[\|]{1}[0,1]{1}[\|]{1}[0-9]{12}[\|]{1}[0,1]{1}[\|]{1}[0-9]{12}[\|]{1}

これは私の正規表現関数です:

//Compare the entire line at once
public static bool MatchCCRegEx(string spLine)
{
    try
    {
        Regex CCLineCheck = new Regex(
                Properties.Settings.Default.CCRegExValidationString);
        Match CCLineMatch = CCLineCheck.Match(spLine);

        if (CCLineMatch.Success)
            return true;
        else
            return false;
    }
    catch (Exception RegExCheckExc)
    {
        WELogger.LogEvent("3", 
            "Error running RegEx check on this line:\r\n" 
            + spLine + "\r\n" + RegExCheckExc.ToString());

        Environment.Exit(9);
        return false;
    }
}

# と Name の間に値が 091091 の余分なフィールドがあるため、私が示したサンプル データは失敗するはずです。2 行目も余分なフィールドのために失敗するはずです (しかし、その行は空です)。「#|#|Name|bool」では、091091 が名前とパスに入力されているように見えるため、正規表現を何時間も見つめましたが、「RGT Foods, Inc.」0または1として渡すべきではありません...しかし、両方の行が正規表現を渡します。何が間違っていますか?

ありがとう。

4

4 に答える 4

4

.{0,25}だけでなく、その前にRGT Foods, Inc.も一致するため、一致しています。091091|

「フリー」フィールドにパイプが含まれないことがわかっている場合は、に置き換え.{0,25}ます[^|]{0,25}。(「ゼロから 25 個の非パイプ文字」。)

また、読みやすくするために、

  • [\|][|]またはと書くことができます\|
  • {1}完全に削除できます。デフォルトは「1 回一致」です。
  • [A-Z,a-z,0-9]A ~ Z、a ~ z、0 ~ 9 、およびカンマに一致します。あなたはおそらく意味し[A-Za-z0-9]ます。同様に、[0,1]あるべきであり[01][0-9,A-Z]あるべきです[0-9A-Z]

正直なところ、空きフィールドにパイプを含めることができないことがわかっている場合はString.Split、パイプを使用して各フィールドを個別に検証します。その正規表現は悪夢です。

于 2012-12-17T14:58:09.730 に答える
1

問題は、|区切り文字間の一致の一部として許可していることです。あなたはおそらくそれをしたくないでしょう。{1}また、余分なブレースが不要なため、多くの余分なブレースを削減できます。おそらくコンマも許可したくないでしょう:

^\|[DUA]\|[0-9A-Z]{8}\|[0-9A-Z]{8}\|[^|]{0,25}\|[^|]{0,25}\|[^|]{0,25}\|[A-Za-z]{2}\|[0-9]{5}\|[A-Za-z0-9]{12}\|[A-Za-z0-9]{10}\|[^|]{0,25}\|[01]\|[0-9]{12}\|[01]\|[0-9]{12}\|[01]\|[0-9]{15}\|[01]\|[0-9]{12}\|[01]\|[0-9]{12}\|[01]\|[0-9]{12}\|[01]\|[0-9]{12}\|[01]\|[0-9]{12}\|
于 2012-12-17T14:58:20.200 に答える
0

区切られたファイルを解析するための正規表現の代わりに、このタスク用に構築されたライブラリを使用することをお勧めします。

一般的なオプションはFileHelpersであり、このために作成されMicrosoft.VisualBasic.FileIOTextFieldParserクラスがあります。

于 2012-12-17T15:00:09.777 に答える
0

Aは、を含む.{0,25}すべて(長さ0〜25)に一致します。を除外してみてください。 |[^\|]{0,25}|

于 2012-12-17T14:57:23.680 に答える