[C#]正規高度
正規表現での.NETはPerl 5の正規表現に基づいています。
タイムアウト
.NET Frameworkの4.5、操作中に指定されたタイムアウト時間に一致する正規表現のサポートを開始します。一致がタイムアウトしている場合は、それがスローされます RegexMatchTimeoutException
。
すべてのメソッドは、増加したタイムアウトパラメータでオーバーロードされます。
public static Match Match(string input, string pattern, RegexOptions options, TimeSpan matchTimeout); public static MatchCollection Matches(string input, string pattern, RegexOptions options, TimeSpan matchTimeout); public static string Replace(string input, string pattern, string replacement, RegexOptions options, TimeSpan matchTimeout); public static string[] Split(string input, string pattern, RegexOptions options, TimeSpan matchTimeout);
あなたのアプリケーションは、任意の正規表現を処理する必要がある場合(例えば、高度な検索ダイアログボックスで)無限コンピューティングへの悪質な正規表現のリードを防ぐために、このパラメータを使用してください。
正規表現のコンパイル
RegexOptions.Compiled
オプションは、行います Regex
、特定の改善のマッチング速度のための軽量のビルドとコンパイルコードジェネレータ動的正規表現コードの例を。
パターン修飾子
パターン修飾子はないだけで開くことができます、だけでなく、閉じました。次の例では、ケースオープンし、クローズ無視した場合、マッチング結果を無視します Aa
。
Regex.Match("AAAa", "(?i)a(?-i)a").Value; // Aa
ゼロ幅アサーション
今、正規表現の要件への準拠を検証するために使用されるパスワードを記述し、それはそれは少なくとも一つの番号が含まれていますが必要です。
これはそれとして、非常に簡単です
Regex.IsMatch("12345678", "\d");
今、条件を追加、長さが6以上です。達成されない通常の缶を使用しているようです。
実際には、ゼロ幅アサーションで、可能である 前進1アサーション こと。
前進1アサーション (?=exp)
一般expの前にコンテンツを一致させるために使用され、。次の例は、例えば、名前を削除するには、一致する必要は ,
以前の内容を。
Regex.Match("姓名张三,男,30 岁", "(?<=姓名).*?(?=,)").Value; // 张三
実際には、正しい理解がある:マッチが成功した後、正の第1アサーションは、続行するために試合後、スタート位置に戻されます。
ここで最も重要な点は、条件の元裁判官、その理解が正しいように、成功したリターンマッチの後に開始位置ということです。
次いで、上記のコードは、少なくとも一つの数を含み、等6よりも長さの大きいを達成します。
Regex.IsMatch("abcde6", @"(?=.*\d).{6,}");
私たちは少し難しく、パスワードの要件は、以下の条件を満たして追加します。
- 少なくとも8
- 少なくとも一つの番号が含まれています
- 少なくとも一つの小文字の文字を含んで
- 少なくとも一つの大文字が含まれています
string pattern = @"(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}";
Regex.IsMatch("12345678", pattern); // false
Regex.IsMatch("1234567a", pattern); // false Regex.IsMatch("123456aA", pattern); // true
スプリット文字列
結果に含まれていないデリミタ文字列を分割し、結果に含まれるセパレータには、フォワード状態の前に式に含まれてもよいです。
foreach (string s in Regex.Split("oneTwoThree", "(?=[A-Z])")) Console.WriteLine(s); // one // Two // Three
パケット
正規表現は、\ nのnグループの構文の参照インデックスすることができます。
var m = Regex.Matches("pop pope peep", @"\b(\w)\w+\1\b");
// pop
// peep
グループの構文をキャプチャする名前付き:(?'组名'表达式)
または (?<组名>表达式)
名前のグループ構文を参照します\k'组名'
か \k<组名>
テキストとセグメンテーションを交換してください
置換文字列 $0
の代替構造として、元の試合へのアクセス。$1
、$2
アクセスがすべてのパケットを捕獲しました。名前のグループのために、によって ${name}
訪問の方法。
すべての数字は、<>を追加します。
Console.WriteLine(Regex.Replace("1 + 11 = 12", @"\d+", @"<$0>"));
// <1> + <11> = <12>
MatchEvaluator手数料
Replace
この方法は、使用して、過負荷を持っている MatchEvaluator
代わりに、パラメータとしてデリゲートを replacement
。手数料は、各マッチのために一度実行され、その元の文字列に置換値を使用して結果を返すであろう。
MatchEvaluator
デリゲートの定義:
public delegate string MatchEvaluator(Match match);
例:
Console.WriteLine(Regex.Replace("1 + 11 = 12", @"\d+", m => (int.Parse(m.Value) * 10).ToString()));
// 10 + 110 = 120