逆参照とは、一致したグループを式自体の他の場所に参照することを指します。たとえば、HTML タグを一致させる場合、<a> を一致させ、</ a> を見つけるために一致した a を引用符で囲む必要があります。後方参照を使用します。
構文
a. 番号付きグループを後方参照する場合、構文は number です
。 b. 名前付きグループを後方参照する場合、構文は k<name> です。
例
a. ペアになった HTML タグ
@"<(?<tag>[^) s>]+)[^>]*>.*</k<tag>>"
b. 重複する 2 つの文字の一致
public static void Main()
{
文字列 s = "aabbc11asd";
Regex reg = new Regex(@"(w)1");
MatchCollection の一致 = reg.Matches(s);
foreach(m 個の一致に一致)
Console.WriteLine(m.Value);
Console.ReadLine();
戻り結果は、いくつかのグループ構造に従う aa bb 11 補助一致グループです
。
括弧
内のパターンは一致結果1
の一部として保存されません
。肯定ステートメント (?=) の意味: 括弧内のパターンは次のとおりです。ステートメントの右側に表示されますが、一致の一部としては表示されません
public static void Main()
{
文字列 s = "C#.net、VB.net、PHP、Java、JScript.net";
Regex reg = new Regex(@"[w#]+(?=.net)",RegexOptions.Compiled);
MatchCollection mc = reg.Matches(s);
foreach(mc 内の m と一致)
Console.WriteLine(m.Value);
Console.ReadLine();
// C# VB JScript を出力します
2. 否定宣言 (?!)
意味: 括弧内のパターンは宣言
の右側に現れてはなりませ
ん
。
次の例は、他の HTML タグが含まれている場合でも、タグ ペア内の < a>All コンテンツを取得する方法を示しています。
パブリック静的 void Main()
{
string newsContent = @"url:<a href=""1.html""><img src=""1.gif"">test<span style=""color:red;"">正規表現</span> </a>。」;
Regex regEnd = new Regex(@"<s*a[^>]*>([^<]|<(?!/a))*<s*/as*>",RegexOptions.Multiline) ;
Console.WriteLine(regEnd.Match(newsContent).Value);
//結果: <a href="1.html"><img src="1.gif">テスト<span style="color:red;">正規表現</span></a>
Console.ReadLine();
3.
逆肯定宣言 (?<=) の意味: 括弧内のパターンは宣言の左側に出現する必要がありますが、一致の一部としてではありません
。
4. 逆否定宣言 (?<!) の意味
:括弧内のパターンは使用できません。 ステートメントの左側に表示される
非バックトラッキング マッチング
構文: (?>)
意味: このグループが一致した後は、一致した文字をバックトラッキングによる後続の式の一致に使用することはできません。ははは、この文を読んだだけでは絶対に理解できないでしょう。これを理解するのに多くの時間を費やしたので、例を使って説明しましょう。
「 www.csdn.net 」は @"w+.(.*).w+" と一致しますが、@"w+.(?>.*).w+" と一致することはできません。なぜ?
その理由は、正規のマッチングでは、可能な限り多くの結果が一致するためです。そのため、上記の例の 2 つの正規表現の .* は、この時点で、最初の式と完全に一致します。 in マッチングを開始すると、.w+ には一致する文字がないことがわかり、いわゆるバックトラックによって .* のマッチング結果がプッシュバックされ、プッシュバックの残りの文字がマッチングに使用されます。 .w+ 、.w+ が正常に一致するまで、式全体が正常に一致した結果を返します。 2 番目の式は非バックトラッキング マッチングを使用しているため、.* が一致した後はバックトラッキングを通じて .w+ と一致することができないため、式全体が一致しません。
バックトラックはリソースの無駄であることに注意してください。そのため、正規表現と一致させるためにバックトラックを行わないようにしてください。上記の例のように、@"w+.([^.]+ ) に置き換えることができます。 .)+w+「+」。