2

これは私の前の質問の続きです。.NET 正規表現エンジンは一致を返しませんが、 8 を期待しています。

私のクエリはすべてを完全に処理しており、キャプチャ グループはうまく機能していますが、処理方法がわからないエッジ ケースが見つかりました。

これは私が問題を抱えているテストケースです。

INSERT INTO [Example] ( [CaseNumber] , [TestText] )
VALUES
(1 , 'Single Line Case'),
(2 , 'Multi
Line Case');
(3 , 'Two Lines with odd end '');
Case');
(4 , ''),
(5 , 'Case 3 is the Empty Text Case');

これが私が使用しているパターンです。RegexOptionsフラグSingleline、、、、およびMultilineExplicitCaptureIgnorePatternWhitespace

^\(
((('(?<s>.*?)'(?!')) |
 (?<n>-?[\d\.]+)
 )(\s,\s)?
)+
#(?<!'')   #Commented Case 3 works, un-commented case 2 works
\)[;,]\r?$

ケース 3 またはケース 4 のいずれかを処理できますが、両方を処理するのに問題があります。

キャプチャ グループ 's` に偶数があるかどうかを確認する方法があれ'ば、実際の行末にいるのか、それともちょうどその行で終わる行があるテキスト ブロックにいるのかを確認できます。たまたまパターンが一致。しかし、複数の行のテキスト文字列を処理するために他の例を変更する方法がわかりません。

単一の正規表現クエリで実行したいことはありますか、それとも後処理 (コメントされたケースを使用) を実行する必要があり、これは 2 つのパスですか?


LINQPadで実行するコードは次のとおりです

string text = 
@"INSERT INTO [Example] ( [CaseNumber] , [TestText] )
VALUES
(1 , 'Single Line Case'),
(2 , 'Multi
Line Case');
(3 , 'Two Lines with odd end '');
Case');
(4 , ''),
(5 , 'Case 3 is the Empty Text Case');
";

const string recordRegex =
@"^\(
((('(?<s>.*?)'(?!')) |
 (?<n>-?[\d\.]+)
 )(\s,\s)?
)+
#(?<!'')   #Commented Case 3 works, un-commented case 2 works
\)[;,]\r?$";

var records = Regex.Matches(text, recordRegex, RegexOptions.Singleline | RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace | RegexOptions.ExplicitCapture);
records.Dump();
4

1 に答える 1

1

このような式は、そのような引用符に一致します。

(?:'[^']*')+

そのような引用符内にないfooときに一致させたい場合は、次のようなものを使用できます。

foo(?=[^']*(?:'[^']*'[^']*)+\z)

キャプチャ グループとして引用符で囲まれていないテキストと数字を含む 1 行あたり 1 つの一致

このようなもの:

(?xm)^
\(

(?:
    (?:
        (?<quote> (?:'[^']*')+ )
    |   (?<num>   -?\d+(?:\.\d+)? )
    |   (?<x>     X'[0-9a-f]*' )
    )
    (?:\s*,\s*)?
)+

\)
[;,] 
\r?$
于 2012-04-05T16:44:07.523 に答える