これは私の前の質問の続きです。.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
、、、、およびMultiline
ExplicitCapture
IgnorePatternWhitespace
^\(
((('(?<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();