0

lua に似た独自のファイル形式を解析するために使用する大きな正規表現があります。これは正常に機能しますが、split が重複する結果を返してはならないにもかかわらず、引用符内の数字が 2 回一致することを除いては問題ありません。このコンソールアプリにまで単純化しました。何か案は?

static void Main(string[] args)
{
    string pattern = "(\r\n)|(\"(.*)\")"; // Splits at \r\n and anything in "quotes"

    string input = "\"01\"\r\n" + // "01"
                   "\"02\"\r\n" + // "02"
                   "\"03\"\r\n";  // "03"

    string[] results = Regex.Split(input, pattern );
    foreach (string result in results )
    {
            //This just filters out the split \r\n and empty strings in results
            if (string.IsNullOrWhiteSpace(result) == false) 
                Console.WriteLine(result);
    }
    Console.ReadLine();
}

戻り値:

"01"
01
"02"
02
"03"
03
4

2 に答える 2

2

ドキュメントから

キャプチャ括弧がRegex.Split式で使用されている場合、キャプチャされたテキストは結果の文字列配列に含まれます。たとえば、キャプチャ括弧内に配置されたハイフンで文字列 " plum-pear" を分割すると、返された配列にハイフンを含む文字列要素が追加されます。

1 つは引用符を含み、もう 1 つは排他的です。これらは、表示されている文字列を返します。

のパターンRegEx.Splitは、目的の結果に一致するはずがなく、区切り文字に一致するはずであることに注意してください。通常、引用符で囲まれた文字列は区切り文字ではありません。

また、貪欲な一致を使用したため、結果は非常に奇妙に見えます。どうやら「入力文字列をできるだけ多く分割する」という要件のようです。操作全体でマッチングを非貪欲にします。

全体として、間違ったツールを使用していると思います。正規表現は、実装によっては、ネストされたグループを処理できないか、非常に非効率的です。単純な DFA の方がはるかにうまく機能し、1 回以上のスキャンが必要になることはありません。

于 2010-12-18T04:33:07.587 に答える
1

外側の括弧を削除するだけです。

string pattern = "(\r\n)|\"(.*)\"";

//Tested output:
01
02
03
于 2010-12-18T04:37:23.717 に答える