マインドマップ
はじめに
開発では正規表現を頻繁に使用する必要があります。現在、JavaScript、Java、.net、php などの多くの開発言語に正規表現アプリケーションがあります。今日は正規表現についての私の理解を共有します。皆さんに教えてください。不適切だったら私に言ってください!
知っておくべき用語 - 次の用語についてどの程度知っていますか?
区切り文字; 修飾子; ワイルドカード (前方参照、逆参照);
ポジショニング
正規表現を使用するのはどのような場合ですか? すべての文字操作で正規表現が使用されるわけではありません。これは実際に効率に影響します。複雑なテキスト データの解析が必要な場合は、正規表現を使用することをお勧めします。
メリット
正規表現を使用すると、複雑な文字操作を処理する際の作業効率が向上し、コードをある程度節約できます。
デメリット
正規表現を使用する場合、正規表現が複雑になるとコードが複雑になり、理解しにくくなります。そのため、正規表現内にコメントを追加する必要がある場合があります。
ユニバーサルモード
区切り文字。通常は開始と終了の区切り文字として「/」が使用されますが、「#」も使用できます。「#」を使用するのはどのような場合ですか? 通常、文字列に「/」文字が多数含まれる場合、そのような文字は uri などの正規表現でエスケープする必要があるためです。
「/」区切り文字を使用したコードは以下の通りです。
$regex = '/^http://([w.]+)/([w]+)/([w]+).html$/i';
$str = 'http://www.youku.com/show_page/id_ABCDEFG.html';
$matches = array();
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
echo "n";
preg_match の $matches[0] には、パターン全体に一致する文字列が含まれます。「#」区切り文字を使用したコードは次のようになります。このとき、「/」はエスケープされません。
$regex = '#^http://([w.]+)/([w]+)/([w]+).html$#i';
$str = 'http://www.youku.com/show_page/id_ABCDEFG.html';
$matches = array();
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
echo "n";
修飾子: 正規表現の動作を変更するために使用されます。
('/^http://([w.]+)/([w]+)/([w]+).html/i') の最後の「i」は修飾子であり、無視することを意味します。私たちがよく使うもう 1 つの文字は、スペースを無視することを意味する「x」です。
貢献コード:
$regex = '/HELLO/';
$str = 'こんにちは';
$matches = array();
if(preg_match($regex, $str, $matches)){
echo 'いいえ i:Valid Successful!',"n";
}
if(preg_match($regex.'i', $str, $matches)){
echo 'YES i:Valid Successful!',"n";
}
文字フィールド: [w] 角括弧で囲まれた部分が文字フィールドです。
修飾子: [w]{3,5}、[w]*、[w]+ など、[w] の後の記号はすべて修飾子を表します。具体的な意味をご紹介します。
{3,5} は 3 ~ 5 文字を意味します。 {3,} は 3 文字を超え、{,5} は最大 5 文字、{3} は 3 文字です。 *は0以上、+は1以上を意味します。
キャレット
文字フィールド ([^w] など) に入れて否定 (含めないという意味) を表現します - 「選択を反転」
式の前に配置すると、現在の文字から開始することを意味します。 (/^n/i、n で始まることを意味します)。
しばしば「」エスケープ文字と呼ばれることに注意してください。 「.」、「/」などの一部の特殊記号をエスケープするために使用されます
ワイルドカード (ルックアラウンド): 特定の文字列内の特定の文字の有無をアサートします。 ルックアラウンドには、先読み (前方参照 ?=) と後読み (逆引き ?<=) の 2 種類があります。
形式:
前方参照: (?!) に対応する (?=) は否定的な意味を意味します。逆引き参照: (?
に対応)の文字が続きます
$regex = '/(? $str = 'abcdefgk';
$matches = array();
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
echo "n";
否定的な意味:
$regex = '/(? $str = 'abcdefgk';
$matches = array();
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
echo "n";
文字幅: 0
ゼロ文字コードを検証
$regex = '/HE(?=L)LO/i';
$str = 'HELLO';
$matches = array();
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
echo "n";
結果を印刷できません!
$regex = '/HE(?=L)LLO/i';
$str = 'HELLO';
$matches = array();
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
echo "n";
結果を印刷できます!
説明: (?=L) は、HE の後に L 文字が続くことを意味します。ただし、(?=L) 自体は 1 文字を占有しないため、それ自体が 1 文字を占有する (L) とは区別する必要があります。
データをキャプチャ
タイプを指定しないグループ化は、後で使用するために取得されます。
指定されたタイプはワイルドカード文字を参照します。したがって、括弧の先頭に疑問符のないもののみがキャプチャされます。
同じ式内の参照は後方参照と呼ばれます。
呼び出し形式: 番号 (1 など)。
$regex = '/^(川山家)[ws!]+1$/';
$str = '川山家、ありがとう川山家';
$matches = array();
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
echo "n";
データのキャプチャを避ける
形式:(?:パターン)
利点: 有効な後方参照の数が最小限に抑えられ、コードがより明確になります。
名前付きキャプチャ グループ
形式: (?P) 呼び出しメソッド (?P=グループ名)
$regex = '/(?P
川山家)[s]Is[s](?P=著者)/i';
$str = 'author:chuanshanjia chuanshanjia です';$matches = array();
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
echo "n";
ランニング結果
遅延マッチング (覚えておいてください: 2 つの操作が実行されます。以下の原則部分を参照してください)
形式: 修飾子?
原則: "?": 前に修飾子がある場合、最小のデータが使用されます。たとえば、「*」は 0、「+」は 1 となります。{3,5} の場合は 3 がとられます。
まず、次の 2 つのコードを見てください:
コード 1.
$regex = '/heL*/i';
$str = 'heLLLLLLLLLLLLLL';
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
echo "n";
結果 1.
コード 2
$regex = '/heL*?/i';
$str = 'heLLLLLLLLLLLLLL';
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
echo "n";
結果 2
コード 3、「+」を使用します
$regex = '/heL+?/i';
$str = 'heLLLLLLLLLLLLLL';
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
echo "n";
結果 3
コード 4、{3,5}
$regex = '/heL{3,10}?/i';
$str = 'heLLLLLLLLLLLLLLLL';
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
echo "n";
結果 4
正規表現に関するコメント
形式: (?# コメント内容)
使用法: 主に複雑なコメントに使用されます
貢献コード: MYSQL データベースへの接続に使用される正規表現です
$regex = '/
元のリンク: http://www.cnblogs.com/baochuan/archive/2012/03/12/2391135.html
^host=(?
([w!@#$%^&*()_+-]+) (?#ユーザー名)
([w!@#$%^&*()_+-]+) (?#パスワード)
(?!)$/ix';
$str = 'host=192.168.10.221root123456';
$matches = array();
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
エコー「n」