0

文字列の単一の正規表現を見つけるのを手伝ってください:

  1. 567,"これは A として知られるキャラクターです。"
  2. 567,これはAというキャラクターです。
  3. 567,"これは (/r) A として知られるキャラクターです。"

私はこれのために次の正規表現を試しました:

1.

^([0-9]+)[ ?]*,[ ?]*(?(?=")(("(?:[^"]|"")*"|[^,]*)(,("(?:[^"]|"")*"|[^,]*))*)|([a-z, a-z]*))$

2.

^([0-9]+),(["]{1}[a-z,a-z]*["]{1})$

コメント:正規表現 1 は問題なく動作しますが、 2 つのグループしか存在しないはずなので、6 つのグループが得られます。

リンクを たどって確認してみてくださいhttp://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx MultiLine を選択してチェックします。

4

2 に答える 2

1

次のことを試してください。ピリオドはパターンの終わりを一貫して示しており、開始引用符と終了引用符はオプションであると想定しています。

^(\d+),["]?([^.]*[.])["]?

これのc#バージョンは...

            var data = @"567,""this is a character, known as A.""
567,This is a character, known as A.
567,""this is a character, known as 
 A.""";
        var pattern = @"^(\d+),[""]?([^.]*[.])[""]?";

        foreach (Match mx in Regex.Matches(data, pattern, RegexOptions.Multiline))
        {
            Console.WriteLine("Group Count: {0}:  Group[1]: {1}, Group[2]: {2}", 
                         mx.Groups.Count, mx.Groups[1].Value, mx.Groups[2].Value);
        }

(注:グループ0は常に完全一致であるため、実際には3つのグループを取得しますが、それ以外の場合は、期待する2つのグループを取得します)

ちなみに、このパターンは意図的に一般的なものです。また、次のような入力データに対しても機能します...

678, This is a character, known as 1.

これは元の要件には含まれていません。ただし、非常に限られたデータ例を示しており、データ内で他の文字タイプを検索できると想定するのは妥当です。正当な一致を見逃さずに、誤検知を除外するのに十分に具体的なパターンを作成することは、バランスをとる行為です。

于 2012-08-29T11:53:59.320 に答える
1

これregexはすべきです!

^(\d+),("?[\p{L}\p{P}\s\r]*"?)$

\p{L}->すべての大文字と小文字に一致します

\p{P}->すべての句読点に一致します..

\s->スペースにマッチします

\r->キャリッジ リターンに一致します

于 2012-08-29T11:36:31.807 に答える