21

C# プログラムに次の正規表現があり、理解するのが困難です。

(?<=#)[^#]+(?=#)

私が理解したと思うものに分解します:

(?<=#)    a group, matching a hash. what's `?<=`?
[^#]+     one or more non-hashes (used to achieve non-greediness)
(?=#)     another group, matching a hash. what's the `?=`?

だから私が抱えている問題は?<=and?<の部分です。MSDN を読むと、?<name>グループの名前付けに使用されますが、この場合、山かっこは決して閉じられません。

ドキュメントで見つけることができません?=でした。検索エンジンはこれらの特殊文字をほとんど無視するため、検索するのは非常に困難です。

4

3 に答える 3

34

それらはルックアラウンドと呼ばれます。実際に一致させることなく、パターンが一致するかどうかをアサートできます。4つの基本的な回避策があります。

  • ポジティブな見返り:私たちが一致することができるかどうかを確認してくださいpattern...
    • (?=pattern)-...現在の位置の右側(を見据えて)
    • (?<=pattern)-...現在の位置の左側(後ろを見てください)
  • ネガティブルックアラウンド-一致できないかどうかを確認しますpattern
    • (?!pattern)-...右へ
    • (?<!pattern)-...左に

簡単なリマインダーとして、見回すために:

  • =正であり、!である
  • <後ろを見る、そうでなければ先を見る

参考文献


しかし、なぜルックアラウンドを使用するのですか?

#([^#]+)#上記のパターンのルックアラウンドは必要ではなく、うまく機能する(\1非を取得するためにキャプチャされた文字列を抽出する)と主張する人もいるかもしれません#

完全ではありません。違いは、ルックアラウンドがと一致しないため、次の一致の#試行で再び「使用」できることです。簡単に言えば、ルックアラウンドは「一致」をオーバーラップさせることができます。

次の入力文字列について考えてみます。

and #one# and #two# and #three#four#

ここで#([a-z]+)#、次の一致を示します(rubular.comで見られるように):

and #one# and #two# and #three#four#
    \___/     \___/     \_____/

(?<=#)[a-z]+(?=#)これを、に一致する、と比較してください。

and #one# and #two# and #three#four#
     \_/       \_/       \___/ \__/

残念ながら、これはrubular.comでデモンストレーションできません。これは、ルックビハインドをサポートしていないためです。ただし、先読みをサポートしているため、 ( rubular.comで見られるように#([a-z]+)(?=#)一致する、と同様のことを行うことができます。

and #one# and #two# and #three#four#
    \__/      \__/      \____/\___/

参考文献

于 2010-06-22T12:18:04.710 に答える
4

別の投稿者が述べたように、これらはlookaroundsであり、何をいつ一致させるかを変更するための特別な構造です。これは言います:

(?<=#)    match but don't capture, the string `#`
            when followed by the next expression

[^#]+     one or more characters that are not `#`, and

(?=#)     match but don't capture, the string `#`
            when preceded by the last expression

したがって、これは 2 つの の間のすべての文字に一致します#

多くの場合、先読みと後読みは非常に便利です。たとえば、「b後に が続かないすべての s に一致する」というルールを考えてみましょうa。最初の試みは のようなものかもしれませんが、それは正しくありません: これはinまたはinb[^a]にも一致しますが、必要なのは. そして、一致する文字がこれ以上ないため、その後に が続いていなくても、 inと一致しません。bubusboboybbcaba

これを正しく行うには、先読みが必要です: b(?!a)。これは、「一致するbが、aその後は一致せず、その部分を一致させない」ことを意味します。したがって、それはあなたが望むものであるbinだけに一致します。bolo同様に、 in と一致しbますcab

于 2010-06-22T12:04:02.220 に答える
1

それらはルックアラウンドと呼ばれます: http://www.regular-expressions.info/lookaround.html

于 2010-06-22T11:57:22.123 に答える