4

注意!これは正規表現の問題とは関係ありません。文字列の一部ではなく全体に一致します


こんにちは、みんな。やろうとする

Match y = Regex.Match(someHebrewContainingLine, @"^.{0,9} - \[(.*)?\s\d{1,3}");

他の VS ヘブライ語のクセ (文字列を編集するときに ] を [ に置き換えるのはどうですか?) は別として、時折クレイジーな結果が返されます。

Match.Captures.Count = 1;
Match.Captures[0] = whole string! (not expected)
Match.Groups.Count = 2; (not expected)
Match.Groups[0] = whole string again! (not expected)
Match.Groups[1] = (.*)? value (expected).

Regex.Matches()同じように行動しています。

そのような行動の一般的な理由は何ですか? 注: Regex.Match("-היי45--", "-(.{1,5})-") (サンプルが正しく表示されません!, ページのソース コードを参照してください) のような単純なテスト文字列では、このように動作しません。一致した文字列には が含まれていますが[ .... ]、単純にテスト文字列に追加しても同じ効果はありません。

4

3 に答える 3

6

私も .NET 正規表現を使い始めたときに、この問題に遭遇しました。これを理解する方法は、 のGroupメンバーがMatch入れ子メンバーであることを理解することです。Groupsより低いキャプチャに到達するには、トラバースする必要があります。グループにもCaptureメンバーがいます。はMatch、式に対する文字列全体の「一致」が成功したことを表すという点で、上部の「グループ」に似ています。1 つの入力文字列に複数の一致が含まれる場合があります。メンバーは、完全な式のCaptures一致を表します。

あなたが持っているように単一のキャプチャを持っているときはいつでも、Group[1]あなたが興味を持っているデータになります.このページを見てください. 例 2 と 3 のソース コードは、印刷用にハードコードされていGroups[1]ます。

1 回の一致操作で、1 回のキャプチャで複数の部分文字列をキャプチャできることに注意してください。この場合、Match.Groups[1].Captures.Count1 より大きいことがわかります。また、一致する複数のテキスト行を単一のMatch呼び出しに渡した場合Match.Captures.Count、1 より大きいことがわかりますが、各トップレベルMatch.Capturesは完全になります。完全な式に一致する文字列。

于 2012-08-10T19:46:22.393 に答える
4

パターンには 1 つのキャプチャ グループがあります。それがグループ1です。

試合全体であるグループ 0 が常に存在します。

したがって、合計 2 つのグループがあります。

于 2012-08-10T19:46:19.843 に答える
1

My test regex was different from any others in the project's scope (thats what happens when Perl guy comes to C#), as it had no lookaheads/lookbehinds. So this discovery took some time.

Now, why we should call Regex behaviour undocumented, not undefined:

let's do some matches against "1.234567890".

  • PCRE-like syntax: (.)\.2345678
  • lookahead syntax: (.)(?=\.\d)

When you're doing a normal match, the result is copied from whole matched part of line, no matter where you've put the parentesizes; in case of lookaheads present, anything that did not belongs to them is copied.

So, the matches will return:

  • PCRE: 1.2345678 (at 2300, this looks like original string and I start yelling here at SO)
  • lookahead: 1
于 2012-08-10T21:20:36.677 に答える