正規表現は、文字列パターンを表現するために使用される式です。たとえば、[0 - 9]{4}
4つの数値を表現する場合、複雑なワイルドカードと見なすことができます。これは主に、テキストから特定の種類の文字列を見つけるために使用されます。
1.正規表現の基本要素
正規表現は、実際には特定の形式の文字列のパターンを照合するために使用されます。パターンは主に、位置、文字、数量詞(文字数)の3つの要素で構成されます。例えば:
^[0-9]{
4}
その中^
で、文字列が行頭に表示される必要がある[0-9]
こと、一致{4}
する数字が数字であること、数字が4つあることを意味します。たとえば、文字と一致することができます。行の先頭に表示されている1998
、2022
など
詳細については、以下の表を参照してください。
いくつかの例:
a..c
-「abbc
」、「aZZc
」、「a09c
」などに一致させることができます。a..c$
-行の終わりから始まり、前方に一致する「abbc
」、「aZZc
」、「a09c
」などを一致させることができます[Bbw]ill
-「Bill
」、「bill
」、「will
」に一致させることができます0[^23456]a
-「01a
」、「07a
」、「0ba
」には一致しますが、「02a
」または「05a
」には一致しません。(good|bad)day
-「goodday」と「badday」を一致させることができますa\(b\)
a(b)
- 「」と一致できる場合、円記号は、括弧がグループ区切り文字としてではなく、通常の文字として扱われることを示します。
その他の例:
a+b
- 「」、「」、「」など、1つ以上の文字のa
後に文字を一致させます。b
ab
aab
aaab
ab+
-a
その後に1つ以上のb
文字列が一致し、ab
「abb
」、「」、「abbb
」などが一致する可能性があります(ab)+
ab
- 「」に1回または繰り返し表示される文字列を照合して、「ab
」、「abab
」、「ababab
」などと照合できるようにします。[0-9]{4}
-任意の4桁に一致します\([0-9]{3}\)-[0-9]{4}-[0-9]{4}
-同様の(666)-6666-6666
形式の電話番号に一致します^.*$
それがあるため、全体のラインに合わせて--Able.*
ゼロ個以上の任意の文字を、一致させることができます^
し、$
行の最初と最後に突き止めをして、試合に開始します^Dav(e|id)
-行の先頭に「Dave」または「David」が表示されている場合は、一致します。
2.正規表現を使用してテキストのパターンを照合します
System.Text.RegularExpression.Regex
このクラスは、テキスト文字列に基づくパターンマッチング関数を提供します。正規表現で一般的に使用される2つの構築方法があります。
Regex();
Regex(string);
でstring
作成されたのコンストラクタパラメータRegex
オブジェクトので、後続のパターンマッチング速度が速いことをプリコンパイルすることができます。文字列と一致するかどうかを確認する場合は、このIsMatch()
メソッドを使用できます。このメソッドのstatic
形式は次のとおりです。
bool ok = Regex.IsMatch("[Bbw]ill", "My friend Bill will pay the bill");
インスタンスメソッドを使用することもできます。
Regex rx = new Regex("[Bbw]ill");
bool ok = rx.IsMatch("My firend Bill will pay the bill");
一致するかどうかを判断するだけでなく、一致する場所などの他の情報を取得したり、複数の一致を実行したりする場合は、Regex
objectMatch()
メソッドを使用できます。
指定された入力文字列で、Regexコンストラクターで指定された正規表現の一致を検索します。
public Match Match(string);
入力文字列の指定された開始位置から開始して、入力文字列で正規表現の一致を検索します。
public Match Match(string, int);
指定された入力文字列のpatternパラメーターで指定された正規表現の一致を検索します。
public static Match Match(string, string);
Match()
このメソッドはMatch
オブジェクトを返します。このオブジェクトは照合プロセスの結果を表すため、このオブジェクトのプロパティを確認することで、照合が行われた場所を知ることができ、どの文字が照合されたかを正確に知ることができます。次の表に、Matchオブジェクトの一般的な属性を示します。メソッドの
使用に加えてMatch()
、Matches()
メソッドを使用して複数の一致結果を取得することもできます。Matches()
このメソッドMatchCollection
はMatch
、コレクションオブジェクトであるオブジェクトを返します。MatchCollection
オブジェクトは実装されたICollection
オブジェクトであり、foreach
ステートメントやGetEnumerator()
その他のメソッドを通じて使用できます。
例、正規表現を使用するいくつかの方法。
#region 示例1, 使用正则表达式的几种方法
static void Test1() {
string pattern = "[Bbw]ill";
string s = "My friend Bill will pay the bill";
if (Regex.IsMatch(s, pattern))
Console.WriteLine("\"{0}\" 与 \"{1}\" 相匹配", s, pattern);
Regex rx = new Regex(pattern);
MatchCollection mc = rx.Matches(s);
Console.WriteLine("有{0}次匹配:", mc.Count);
foreach (Match mt in mc)
Console.WriteLine(mt);
Match m = rx.Match(s);
while (m.Success) {
Console.WriteLine("在位置{0}有匹配{1}", m.Index, m.Value);
m = rx.Match(s, m.Index + m.Length); // 从m.Index + m.Length位置开始
}
Console.WriteLine("another way of writing:");
for (m = rx.Match(s); m.Success; m = m.NextMatch()) {
Console.WriteLine("在位置{0}有匹配{1}", m.Index, m.Value);
}
}
#endregion
演算結果:
3.検索と置換を使用します
Regexクラスは、前の単純な例よりも高度なパターンマッチングを提供できます。最も便利なものの1つは、検索と置換に変数(識別子)を使用することです。検索は一致の結果で表され、置換は一致の置換で表されます。
次の例のように、この例のタスクは、ユニットの電話番号を処理し、名前と内線番号を取り出して、それを印刷することです。その中で、電話リストの各レコードには次の形式があります。
Dr.David Jones,Ophthalmology,x2441
姓と拡張子を抽出して印刷する場合、結果は次のようになります。
2441,Jones
たとえば、正規表現を使用してデータを再フォーマットします。
#region 使用Regex对数据进行重新格式化
static void Test2() {
string pattern = @"^[\. a-zA-Z]+ (?<name>\w+),[a-zA-Z]+,x(?<ext>\d+)$"; // 注意这里逗号为中文逗号
Console.WriteLine(pattern);
string[] sa = {
"Dr.David Jones,Ophthalmology,x2441",
"Ms.Cindy Harriman,Registry,x6231",
"Mr.Chester Addams,Mortuary,x1667",
"Dr.Hawkeye Pierce,Surgery,x0986",
};
Regex rx = new Regex(pattern);
foreach(string s in sa) {
Match m = rx.Match(s);
if(m.Success)
Console.Write(m.Result("${ext},${name}"));
Console.WriteLine("\t" + rx.Replace(s, "姓:${name},分机号:${ext}"));
}
}
#endregion
演算結果:
ここでの正規表現は次のとおりです。
^[\. a-zA-Z]+ (?<name>\w+),[a-zA-Z]+,x(?<ext>\d+)$
以下にこの表現を説明します。
- ①
^
文字列の先頭から一致することを意味します。 - ②
[\. a-zA-Z]
スペース文字、ドット、大文字、小文字のすべての文字列に一致することを意味します - ③
+
は、1つ以上の試合を行うことを意味します。このパターンは、タイトルと名が名と姓の間で一致することを意味します。 - ④
+
番号の後のスペースは、名と姓の間のスペースと一致することを意味します。 - ⑤
(?<name>\w+)
特別な種類のグループが定義されています。?<name>
タグは、加算手段name
にタグをマッチした文字列以降の一致したテキストを参照するために使用することができます。\w
意味はa-zA-Z_0-9
(省略形)と全く同じです。つまり、1つ以上の文字、数字、または下線で構成される単語を意味し、その単語にはname
保管用のラベルが付けられています。 - ⑥
[a-zA-Z]+
部門を定義する句読点や単語と一致します。これは、主に再度使用することを意図していないため、マークされていません。 - ✓
x
文字の後に拡張子番号が表示され、拡張子番号と一致するパターン?<ext>\d+
により、順序付けられた配列をキャプチャし、ext
ラベルを付けて保存することができます。 - ⑧最後
$
は、拡張モードが各行の終わりに表示される必要があることを意味します。
場合Match()
実行、最終的なMatch
物体は、二つのラベル項目(識別子)を有しているname
とext
名前と内線番号を表すために使用されます。Match
オブジェクトのResult()
メソッドを使用すると、出力結果の文字列を取得して、一致した文字列に置き換えることができます。ここではname
、ext
タグとタグが使用されており、それらが含まれてい${}
ます。