正規表現選択グループの後方参照とキャプチャおよび非キャプチャグループ(5)(1000)

序文

デモとして直接例を使用してください。

4つはそうではありませんでした。私がそれを見ていたので、4番目のセクションは当時は誤解されていて、まだ変更されていました。

テキスト

操作を選択

部分的に大文字と小文字を区別

マッチングを行う際に、大文字と小文字が区別されないことを願っています。

もちろん、Pythonライブラリでは、大文字と小文字を区別せずに表示することを選択できます。

しかし、pythonライブラリの記述では、一部大文字と小文字を区別しない要件があります。

たとえば、tは大文字と小文字が区別されますが、大文字と小文字は区別されないことを願っています。

(?I)を使用して大文字と小文字を区別しないことを示し、次のように書くことができます:t(?I)彼、それだけです。

その他の選択操作

ここで説明すると、実際には、各言語の規則性には一定の違いがあります。

ここでは、いくつかの一般的な選択操作を紹介します。

(?m)は複数行マッチングを意味します。明確でない場合は、第3章を参照してください。

(?s)単一行マッチング

(?x)コメントを無視

たくさんありますが、ここで言及すると、各言語が異なります。同じタイプのライブラリを使用するのが最適です。

サブパターン

サブパターンとは何ですか?

グループ内の1つ以上のグループを指し、サブモードはモード内のモードです。

栗の場合、このように理解するのは少し難しいかもしれません:

THE RIME OF THE ANCYENT MARINERE

このような段落を一致させたいのですが、どのように一致させますか?
通常、この方法で確実に一致させることができます。

THE RIME OF THE ANCYENT MARINERE

それから私は今これを書きます:

(THE) (RIME) (OF) (THE) (ANCYENT) (MARINERE)


一致させたい一致と一致するだけでなく、括弧内の各グループがグループ化されます。これはサブパターンです。

キャプチャして元に戻す

it is a dog

定期的

(it is) (a dog)

現時点では、グループ化されます。
$ 2 $ 1の結果は犬です。

これに加えて、\ U $ 1 $ 2結果もA DOGです。

\ Uは、一致を大文字に変換します。

次に、他にもあります:\ uは大文字の最初の文字、\ l最初の文字は小文字\ Lはすべて小文字

これらのJavaまたはその他の高水準言語はネイティブでサポートされていません。一部のライブラリを使用する必要がありますが、これらは通常の仕様です。

名前付きグループ

結果は次のとおりです。

言い換えると、名前付きグループ化、グループ化の参照方法を実行できます。

$ + {one}

$ + {xx}を通じて。

各ネーミンググループは言語によって異なり、Pythonでは(?P ...)、特定の言語を確認します。

キャプチャされていないパケット

非キャプチャパケットは、キャプチャパケットに関連しています。

パケットをキャプチャすると、パケット情報はキャプチャされずにメモリに保存されるため、パフォーマンスは高くなります。

オンラインで別の例を見つけました:

var str = "a1***ab1cd2***c2";
var reg1 = /((ab)+\d+)((cd)+\d+)/i;
var reg2 = /((?:ab)+\d+)((?:cd)+\d+)/i;
alert(str.match(reg1));//ab1cd2,ab1,ab,cd2,cd
alert(str.match(reg2));//ab1cd2,ab1,cd2

(?:xx)Use ?:は非キャプチャグループです。

つまり、(?: Xx)は、括弧を使用して、規則をより明確に記述できるようにすることです。

c#例を1つに:

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string pattern = @"(?:\b(?:\w+)\W*)+\.";
      string input = "This is a short sentence.";
      Match match = Regex.Match(input, pattern);
      Console.WriteLine("Match: {0}", match.Value);
      for (int ctr = 1; ctr < match.Groups.Count; ctr++)
         Console.WriteLine("   Group {0}: {1}", ctr, match.Groups[ctr].Value);
   }
}
// The example displays the following output:
//       Match: This is a short sentence.

原子のグループ化

原子グループは閉じたバックトラックである必要があります。

多くの人々はバックトラックを理解していないので、ここで具体的に説明します:

通常,如果正则表达式包含一个可选或可替代匹配模式并且备选不成功的话,正则表达式引擎可以在多个方向上分支以将输入的字符串与某种模式进行匹配。
如果未找到使用第一个分支的匹配项,则正则表达式引擎可以备份或回溯到使用第一个匹配项的点并尝试使用第二个分支的匹配项。
此过程可继续进行,直到尝试所有分支。

私は例を見つけました:

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string[] inputs = { "cccd.", "aaad", "aaaa" };
      string back = @"(\w)\1+.\b";
      string noback = @"(?>(\w)\1+).\b";
      foreach (string input in inputs)
      {
         Match match1 = Regex.Match(input, back);
         Match match2 = Regex.Match(input, noback);
         Console.WriteLine("{0}: ", input);

         Console.Write("   Backtracking : ");
         if (match1.Success)
            Console.WriteLine(match1.Value);
         else
            Console.WriteLine("No match");

         Console.Write("   Nonbacktracking: ");
         if (match2.Success)
            Console.WriteLine(match2.Value);
         else
            Console.WriteLine("No match");
      }
   }
}
// The example displays the following output:
//    cccd.:
//       Backtracking : cccd
//       Nonbacktracking: cccd
//    aaad:
//       Backtracking : aaad
//       Nonbacktracking: aaad
//    aaaa:
//       Backtracking : aaaa
//       Nonbacktracking: No match

最後のaaaaが一致しないのはなぜですか?

分析:

@ "(?>(\ w)\ 1 +)。\ b"

(\ w)パケットをキャプチャします。つまり、がキャッチされました。
次に、\ 1+は0以上のaに一致することを意味し、アトミック性のため、それは貪欲であり、aaaaに一致します。つまり、一致した後、1つになります(任意の文字)、一致しません。あまりにも。

まとめ

上記は個人的な理解ですので、何か問題がある場合は指摘してください。

おすすめ

転載: www.cnblogs.com/aoximin/p/12748670.html