正規表現のメタキャラクターと一...LOGIN

正規表現のメタキャラクターと一致ルール

字 元文字 符

文字

機能説明

* は、0 回または任意の複数の文字と一致する前のアトムの代表です。 Next+ 1 つの文字に 1 回以上一致します。前にある文字は [オプション] で使用可能です。

より多くの標準をアトムとしてカウントする必要があります。 n
| or を除くすべての文字に一致します。注: 優先度は最も低くなります。 ] ,m} n 回から m 回出現する可能性があります

{m,} 少なくとも m 回、最大数に制限はありません

() 優先順位を変更したり、文字列を全体として扱ったり、一致したデータも

+ は少なくとも 1 つの前の文字

<?php
$zz = '/\d+/';
$string = "迪奥和奥迪250都是我最爱";
//待会儿再试试中间没有0-9的情况
//$string = "迪奥和奥迪都是我最爱";
if(preg_match($zz, $string, $matches)){
    echo '匹配到了,结果为:';
    var_dump($matches);
}else{
    echo '没有匹配到';
}
?>

と正常に一致し、d+ の + を証明します。 d は数字と一致し、+ は前の文字と少なくとも 1 回一致します。

* 0 または任意の数の前の文字と一致します

<?php
$zz = '/\w*/';
$string = "!@!@!!@#@!$@#!";
//待会儿再试试中间没有0-9的情况
//$string1 = "!@#!@#!abcABC#@#!";
if(preg_match($zz, $string, $matches)){
    echo '匹配到了,结果为:';
    var_dump($matches);
}else{
    echo '没有匹配到';
}
?>

説明、コメントアウトされた $string1 と $string は正常に一致しました。なぜなら、w は 0-9A-Za-z_ に一致し、* は前の w が存在しないことを意味するからです。存在する場合は 1 つ以上存在する可能性があります。

? 前の文字は 0 回または 1 回出現します。オプションの

<?php
$zz = '/ABC\d?ABC/';
$string = "ABC1ABC";
//待会儿再试试中间没有0-9的情况
//$string1 = "ABC888888ABC";
//$string2 = "ABCABC";
if(preg_match($zz, $string, $matches)){
    echo '匹配到了,结果为:';
    var_dump($matches);
}else{
    echo '没有匹配到';
}
?>

は $string、$string2 と正常に一致しますが、$string1 と一致しません。
マッチングの前後に ABC があり、真ん中に 0 ~ 9 があるため、0 ~ 9 はオプションですが、複数存在することはできません。

. (ドット) は n を除くすべての文字に一致します

<?php
$zz = '/gg.+gg/';
$string = "ABC1ABC";
if(preg_match($zz, $string, $matches)){
    echo '匹配到了,结果为:';
    var_dump($matches);
}else{
    echo '没有匹配到';
}
?>

は $string、$string2 に一致しますが、$string1 には一致しません。
マッチングの前後に ABC があり、真ん中に 0 ~ 9 があるため、0 ~ 9 はオプションですが、複数存在することはできません。

| (縦棒)、または、最も低い優先順位

優先順位と or のマッチングを実験してみましょう

<?php
$zz = '/abc|bcd/';
$string1 = "abccd";
$string2 = "ggggbcd";
if (preg_match($zz, $string1, $matches)) {
    echo '匹配到了,结果为:';
    var_dump($matches);
} else {
    echo '没有匹配到';
}
?>

見てみましょう:

当初、私のマッチングのアイデアは次のとおりでした。 match abccd または abbcd です。ただし、$string1 と $string2 を照合すると、照合結果は abc と bcd になります。

2 を実装または照合すると、照合結果は abc または bcd になります。連続する文字列よりも高い優先順位はありません。

それでは、上記の例で abccd または abbcd に一致させたい場合はどうすればよいでしょうか?

優先度を変更するには()を使用する必要があります。

<?php
$zz = '/ab(c|b)cd/';
$string1 = "起来abccd阅兵";
$string2 = "ggggbcd";
$string3 = '中国abbcd未来';
if (preg_match($zz, $string1, $matches)) {
    echo '匹配到了,结果为:';
    var_dump($matches);
} else {
    echo '没有匹配到';
}
?>

結果は次のとおりです:

が一致した場合、結果は次のようになります:

array (size=2)

0 => string 'abccd' (length = 5)

1 => ; string 'c' (length = 1)

結論:

1) abccd または abbcd ($string1 または $string3) に一致します。

2) ただし、一致する配列にはもう 1 つの要素があり、この要素の添字は 1 です

3) () 内の内容が正常に一致する限り、一致したデータは配列要素に配置されます。下付き文字 1 中間。

^ (サーカムフレックス)、^

<?php
$zz = '/^好帅\w+/';
$string1 = "好帅abccdaaaasds";
//$string2没有以好帅开始
$string2 = "帅abccdaaaasds";
if (preg_match($zz, $string1, $matches)) {
    echo '匹配到了,结果为:';
    var_dump($matches);
} else {
    echo '没有匹配到';
}
?>

の後の文字列で始まる必要があります。実験により次の結論が見つかりました:

1) $string1 は正常に一致しましたが、$string2 は正常に一致しませんでした

2) $string1 は指定された文字で始まります

3) そして、$string2 は ^

の後の文字で始まりません。この規則の変換の意味は次のとおりです: be soハンサムで始まり、その後に少なくとも 1 つの文字 a-zA-Z0 が続きます-9_。

$ (ドル記号) は $ の前の文字で終わる必要があります

<?php
$zz = '/\d+努力$/';
$string1 = "12321124333努力";
//$string2
$string2 = "12311124112313力";
if (preg_match($zz, $string1, $matches)) {
    echo '匹配到了,结果为:';
    var_dump($matches);
} else {
    echo '没有匹配到';
}
?>

実行して結果を見てみましょう。結論は次のとおりです:

$string1 は正常に一致しますが、$string2 は

$ と一致しませんbefore 文字は d+ で、その後に中国の取り組みが続きます。

したがって、一致するのはこの全体です。 d は 0 ~ 9 の整数を指し、+ 記号は少なくとも 1 つの 0 ~ 9 を表します

b および B の単語境界と非単語境界

境界とは何かを説明しましょう:

1。境界があるということは、この境界は区切り文字の始まりと終わりが規則的な境界です。

2. これは英語の単語の後にスペースがあり、単語が終わり、単語の境界に達したことを意味します

b単語の境界は、最初か最後でなければならないことを意味します。
B は非境界です。つまり、正規表現の先頭または最後に置くことはできません。

<?php
$zz = '/\w+\b/';
$string1 = "this is a apple";
$string2 = "thisis a apple";
$string3 = "thisisaapple";
if (preg_match($zz, $string1, $matches)) {
    echo '匹配到了,结果为:';
    var_dump($matches);
} else {
    echo '没有匹配到';
}
?>

結論:

$string1、$string2、$string3 はすべて正常に一致しました。

$string1 が一致すると、このスペースが境界になります。 $string2 が一致すると、thisisaapple が正規表現全体の終わりに達するので、これも境界になります。したがって、試合は成功です。

単語以外の境界を試してみましょう:

<?php
$zz = '/\Bthis/';
$string1 = "hellothis9";
//$string2 = "hello this9";
//$string2 = "this9中国万岁";
if (preg_match($zz, $string1, $matches)) {
    echo '匹配到了,结果为:';
    var_dump($matches);
} else {
    echo '没有匹配到';
}
?>

概要:

$string1 のマッチングは成功しますが、$string2 のマッチングは失敗します。

B の後に this が続くため、これは単語の境界 (スペースと先頭と末尾) には現れません。

{m} は m 回のみ出現し、m 回のみ出現することができます

<?php
$zz = '/喝\d{3}酒/';
$string1 = "喝988酒";
//$string2 = "喝98811酒";
if (preg_match($zz, $string1, $matches)) {
    echo '匹配到了,结果为:';
    var_dump($matches);
} else {
    echo '没有匹配到';
}
?>

結論:

上の例では、d{3} は、0 ~ 9 は 1 回以上またはそれ以下ではなく、3 回のみ出現できると規定しました。

{n,m} は n 回から m 回まで出現できます

<?php
$zz = '/喝\d{1,3}酒/';
$string1 = "喝9酒";
//$string2 = "喝988酒";
if (preg_match($zz, $string1, $matches)) {
    echo '匹配到了,结果为:';
    var_dump($matches);
} else {
    echo '没有匹配到';
}
?>

結論: 上記の例 d{1,3} では、0 ~ 9 は 1 回、2 回、または 3 回しか出現できないと規定しました。それ以外の時間はすべて間違っています

{m,} 少なくとも m 回、最大数は制限されていません

<?php
$zz = '/喝\d{2,}/';
$string1 = "喝9";
//$string2 = "喝98";
//$string3 = "喝98122121";
if (preg_match($zz, $string1, $matches)) {
    echo '匹配到了,结果为:';
    var_dump($matches);
} else {
    echo '没有匹配到';
}
?>

結論:上記の例 d{2,} では、ドリンクの後ろに 0 ~ 9 が表示されると規定しています2回以上、最大でも回数に制限はありません。したがって、$string1 は一致に失敗し、$string2 は正常に一致します。 $string3 は正常に一致しました。

マッチングルール


基本パターンマッチング

すべては基本から始まります。パターンは正規表現の最も基本的な要素であり、文字列の特性を記述する文字のセットです。パターンは、通常の文字列で構成される単純な場合もあれば、文字範囲、繰り返し、コンテキストを表すために特殊文字を使用する非常に複雑な場合もあります。例:

^once

このパターンには特殊文字 ^ が含まれており、このパターンは、once で始まる文字列のみと一致することを意味します。たとえば、このパターンは文字列「onceUponatime」には一致しますが、「There Once was a man from NewYork」には一致しません。 ^ 記号が先頭を示すのと同様に、$ 記号は特定のパターンで終わる文字列と一致します。

bucket$

このパターンは、「誰がこの現金をすべてバケットに保管したか」には一致しますが、「バケット」には一致しません。文字 ^ と $ を一緒に使用すると、完全一致を表します (文字列はパターンと同じです)。例:

^バケット$

文字列「bucket」のみに一致します。パターンに ^ と $ が含まれていない場合は、そのパターンを含む任意の文字列と一致します。例: パターン

once

は、文字列

と一致します。

このパターンの文字 (o-n-c-e) はリテラル文字、つまり文字自体を表しており、数字についても同様です。句読点や白文字 (スペース、タブなど) など、その他の少し複雑な文字にはエスケープ シーケンスが必要です。すべてのエスケープ シーケンスはバックスラッシュ () で始まります。タブ文字のエスケープ シーケンスは次のとおりです。したがって、文字列がタブ文字で始まるかどうかを検出したい場合は、次のパターンを使用できます:

^t

同様に、「改行」を表すには n を使用し、復帰を表すには r を使用します。他の特殊記号は、前にバックスラッシュを付けて使用できます。たとえば、バックスラッシュ自体は \ で表され、ピリオドは . で表されます。

文字クラスター

インターネット プログラムでは、通常、ユーザー入力を検証するために正規表現が使用されます。ユーザーがフォームを送信するとき、入力された電話番号、住所、電子メール アドレス、クレジット カード番号などが有効かどうかを判断するには、通常のリテラル文字を使用するだけでは十分ではありません。 そのため、必要なパターンを記述するために、より自由な方法、つまり文字クラスターを使用する必要があります。すべての母音を表すクラスターを作成するには、すべての母音を角括弧で囲みます。

[AaEeIiOoUu]

このパターンは任意の母音文字に一致しますが、表すことができるのは 1 文字のみです。次のような文字の範囲を表すにはハイフンを使用します:

[a-z] //すべての小文字と一致

[A-Z] //すべての大文字と一致

[a-zA-Z] //すべての文字と一致

[0 -9] //すべての数字と一致[0-9.-] //すべての数字、ピリオド、マイナス記号と一致
[frtn] //すべての白い文字と一致



同様に、これらも 1 つの文字のみを表します。は非常に重要なものです。 「z2」、「t6」、または「g7」などの小文字と数字で構成される文字列と一致させたいが、「ab2」、「r2d3」、または「b52」とは一致させたくない場合は、次のパターンを使用します:

^[a-z][0-9]$

[a-z] は 26 文字の範囲を表しますが、ここでは最初の文字が小文字である文字列のみと一致します。
^ は文字列の先頭を表すと前述しましたが、別の意味もあります。 ^ が一連の角括弧内で使用される場合、それは「しない」または「除外する」を意味し、特定の文字を削除するためによく使用されます。前の例を使用すると、最初の文字を数字にすることはできません:

^[^0-9][0-9]$

このパターンは、「&5」、「g7」、および「g7」と同じです。 「-2」は一致しますが、「12」または「66」とは一致しません。特定の文字を除外する例をいくつか示します:

[^a-z] //小文字を除くすべての文字
[^\/^] //()(/)(^)を除くすべての文字
[^"'] //二重引用符 ( ") とすべての文字を除く一重引用符 (') を除く

特殊文字「.」(ドット、ピリオド) は、「改行」を除くすべての文字を表すために正規表現で使用されます。したがって、パターン「^.5$」は、数字の 5 で終わり、「改行」以外の他の文字で始まる任意の 2 文字の文字列と一致します。パターン「.」は、空の文字列と「改行」のみを含む文字列を除く、任意の文字列と一致します。

PHP の正規表現にはいくつかの組み込みの共通文字クラスターがあり、そのリストは次のとおりです:

文字クラスター 説明

[[:alpha:]] 任意の文字

[[:digit] :] ] 任意の数字

[[:alnum:]] 任意の文字と数字

[[:space:]] 任意の空白文字

[[:upper:]] 任意の大文字

[[: lower: ]] 任意の小文字

[[:punct:]] 任意の句読点

[[:xdigit:]] [0-9a-fA-F] に相当する任意の 16 進数


繰り返し表示

ここまでで、文字または数字を照合する方法はすでにわかりましたが、多くの場合、単語または数字のグループを照合したい場合があります。単語は複数の文字で構成され、数字のグループは複数の単数で構成されます。文字または文字クラスターに続く中括弧 ({}) は、前のコンテンツが繰り返される回数を決定するために使用されます。

文字クラスタ^a$
^a{4 }$ aaaa

^a{2,4}$ aa,aaa または aaaa ^a{1,3}$ a,aa または aaa

^a {2,}$ 2 つ以上の a を含む文字列

^a{2,} 例: ツチブタと aaab (リンゴは除く)

a{2,} 例: baad と aaa (ただしナンタケット島は除く)

t {2} 2 つのタブ文字

。{2} 2 つの文字すべて

これらの例では、中括弧の 3 つの異なる使用法を説明します。数値 {x} は、「前の文字または文字クラスターが x 回のみ出現する」ことを意味し、数値とコンマ {x,} は、「前のコンテンツが x 回以上出現する」ことを意味します。 ,y} は、「前のコンテンツが少なくとも x 回表示されますが、y 回を超えない」ことを意味します。パターンをさらに多くの単語や数字に拡張できます:

^[a-zA-Z0-9_]{1,}$ //複数の文字、数字、またはアンダースコアを含むすべての文字列
^[1 -9]{ 1,}$ //すべての正の数
^-{0,1}[0-9]{1,}$ //すべての整数
^[-]?[0-9]+ ?[0-9] +$ //すべての浮動小数点数

最後の例は理解しにくいですよね。このように見てください。すべてがオプションのマイナス記号 ([-]?) (^) で始まり、その後に 1 つ以上の数字 ([0-9]+)、そして小数点 (.) が続きます。1 またはより多くの数字 ([0-9]+) が続き、その後に何も続きません ($)。以下では、使用できるより簡単な方法について説明します。

特殊文字「?」は {0,1} に等しく、両方とも「0 または 1 つの前のコンテンツ」または「前のコンテンツはオプション」を表します。したがって、今の例は次のように簡略化できます:

^-?[0-9]{1,}.?[0-9]{1,}$

特殊文字「*」と {0 ,} は同様に、すべて「0 個以上前のコンテンツ」を表します。最後に、文字「+」は {1,} に等しく、これは「1 つ以上の前のコンテンツ」を意味するため、上記の 4 つの例は次のように書くことができます:

^[a-zA-Z0-9_]+ $ //複数の文字、数字、またはアンダースコアを含むすべての文字列
^[0-9]+$ //すべての正の数値
^-?[0-9]+$ //すべての整数
^- ?[0-9 ]*.?[0-9]*$ //すべての浮動小数点数

もちろん、これによって技術的に正規表現の複雑さが軽減されるわけではありませんが、正規表現が読みやすくなります。




次のセクション
<?php //加上了括号 $pattern = '/(\d+)([a-z]+)(\d+)/'; $string = '987abc321'; if (preg_match($pattern, $string, $match)) { echo '匹配到了,结果为:'; var_dump($match); } else { echo '没有匹配到'; } ?>
コースウェア