正規表現のゼロ幅断言例の詳細【PHPベース】
4645 ワード
前言
以前、正規表現に関する記事(//www.jb 51.net/article/11359.html)を書いたことがありますが、ゼロ幅断言についてはあまり言及されていません.今この内容を補足します.本稿では、主に次の問題を解決します.
①ゼロ幅断言とは何か、なぜゼロ幅断言を使うのか②ゼロ幅断言の使い方
コンセプト
ゼロ幅断言は、多くの場合、特定のコンテンツ(ただし、これらのコンテンツを含まない)の前または後のものを検索するために定義されています.つまり、それらはb^$<>のようなアンカー作用であり、位置を指定するために使用され、この位置は一定の条件(すなわち断言)を満たすべきであるため、ゼロ幅断言とも呼ばれます.私の理解は、位置を限定する文字列の前または後にマッチング検索を行うことです.したがって,ゼロ幅断言は,実行過程が2つに分かれており,順方向断言であればそうであるべきであり,第1ステップは,断言が真(すなわち一定条件を満たすか否か)であるか否かを判断する第2ステップであり,条件を満たすと次のステップでマッチングを検索する.逆断言の場合、最初のステップは正規表現の順序で一致します.第2歩、逆代弁に出会って、逆代弁を満たすかどうかを判断します.
真っ先に断言する
先行断言とは,文字列の対応する位置の前にマッチングを検索し,(?=exp)を用いてexpの前の位置をマッチングすることである.
≪インスタンス|Instance|emdw≫
?
1 2 3 4 5 6 7 8 9 10
解析:まず文字列「abcgwcab」のgw位置を検索し、真と断言し、bcをマッチングします.正規表現を$parent='/bc(?=gw)ca/'と書くと、一致しません.
反先行断言
反先行断言とは何か、(?!exp)マッチングを使って後ろに付いているのはexpではありません.
例:
?
1 2 3 4 5 6 7 8 9 10 11
解析:まず文字列にbcが含まれているかどうかを判断し、その後、その後ろがwwではないと判断し、最後にgwに一致する.逆断言の前後を見ると,他のマッチング条件を追加することができる.
正後に断言する.
正後発断言とは、文字列の対応する位置の後にマッチングを検索し、(?<=exp)expの後ろの位置にマッチングすることである.
例:
?
1 2 3 4 5 6 7 8 9 10 11
解析:最初のステップは、「abcgwcab」にgwが含まれているかどうかを検索し、結果をtrueに戻し、次に2番目のステップを行い、gwの後ろにcaがあるかどうかを検索します.
後ろ向きに断言する.
反後発断言とは何ですか.
?
1 2 3 4 5 6 7 8 9 10
以前、正規表現に関する記事(//www.jb 51.net/article/11359.html)を書いたことがありますが、ゼロ幅断言についてはあまり言及されていません.今この内容を補足します.本稿では、主に次の問題を解決します.
①ゼロ幅断言とは何か、なぜゼロ幅断言を使うのか②ゼロ幅断言の使い方
コンセプト
ゼロ幅断言は、多くの場合、特定のコンテンツ(ただし、これらのコンテンツを含まない)の前または後のものを検索するために定義されています.つまり、それらはb^$<>のようなアンカー作用であり、位置を指定するために使用され、この位置は一定の条件(すなわち断言)を満たすべきであるため、ゼロ幅断言とも呼ばれます.私の理解は、位置を限定する文字列の前または後にマッチング検索を行うことです.したがって,ゼロ幅断言は,実行過程が2つに分かれており,順方向断言であればそうであるべきであり,第1ステップは,断言が真(すなわち一定条件を満たすか否か)であるか否かを判断する第2ステップであり,条件を満たすと次のステップでマッチングを検索する.逆断言の場合、最初のステップは正規表現の順序で一致します.第2歩、逆代弁に出会って、逆代弁を満たすかどうかを判断します.
真っ先に断言する
先行断言とは,文字列の対応する位置の前にマッチングを検索し,(?=exp)を用いてexpの前の位置をマッチングすることである.
≪インスタンス|Instance|emdw≫
?
1 2 3 4 5 6 7 8 9 10
$str
=
"abcgwcab"
;
$parent
=
'/bc(?=gw)/'
;
$str
=preg_match(
$parent
,
$str
,
$match
);
var_dump(
$match
);
/**
:
int 1
array (size=1)
0 => string 'bc' (length=2)
*/
解析:まず文字列「abcgwcab」のgw位置を検索し、真と断言し、bcをマッチングします.正規表現を$parent='/bc(?=gw)ca/'と書くと、一致しません.
反先行断言
反先行断言とは何か、(?!exp)マッチングを使って後ろに付いているのはexpではありません.
例:
?
1 2 3 4 5 6 7 8 9 10 11
$str
=
"abcgwcab"
;
$parent
=
'/bc(?!ww)gw/'
;
$str
=preg_match(
$parent
,
$str
,
$match
);
var_dump(
$str
);
var_dump(
$match
);
/**
:
int 1
array (size=1)
0 => string 'bcgw' (length=4)
*/
解析:まず文字列にbcが含まれているかどうかを判断し、その後、その後ろがwwではないと判断し、最後にgwに一致する.逆断言の前後を見ると,他のマッチング条件を追加することができる.
正後に断言する.
正後発断言とは、文字列の対応する位置の後にマッチングを検索し、(?<=exp)expの後ろの位置にマッチングすることである.
例:
?
1 2 3 4 5 6 7 8 9 10 11
$str
=
"abcgwcab"
;
$parent
=
'/(?<=gw)ca/'
;
$str
=preg_match(
$parent
,
$str
,
$match
);
var_dump(
$str
);
var_dump(
$match
);
/**
:
int 1
array (size=1)
0 => string 'ca' (length=2)
*/
解析:最初のステップは、「abcgwcab」にgwが含まれているかどうかを検索し、結果をtrueに戻し、次に2番目のステップを行い、gwの後ろにcaがあるかどうかを検索します.
後ろ向きに断言する.
反後発断言とは何ですか.
?
1 2 3 4 5 6 7 8 9 10
$str
=
"abcgwcab"
;
$parent
=
'/(?;
$str
=preg_match(
$parent
,
$str
,
$match
);
var_dump(
$str
);
var_dump(
$match
);
/**
int 0
array (size=0)
empty
*/
:まず にgwをマッチングし、その 、その がbcであるかどうかを し、その がbcであることを したのでfalseを す.
1:\d+(?=abc)
1つの に「abc」が まれているかどうかを し、その に1つ の が まれているかどうかを します.
2:(?<=\d\d)\w
に する2つの が し、その ろにアルファベットが まれているかどうかを します.
3:\d{3} (?!55)
に する3つの が まれているかどうかを し、3つの の ろに55がないかどうかを します.
4:(?
, ac
まとめ
と の いは?
は を する の であり、 は の の にある. は を する の であり、 は の の にある.ここでの と は、 の に して が の にある である.
PS:ここでは、 に な ツールを2つ します.
JavaScript オンラインテストツール:http://tools.jb51.net/regex/javascript
オンライン ツール:http://tools.jb51.net/regex/create_reg
PHPに する について のある は、「php 」、「PHP (Array) 」、「PHP 」、「PHP と 」、「php プロセス 」、「PHPネットワークプログラミング 」、「php (string) 」を してください.、「php+mysqlデータベース チュートリアル」および「php データベース テクニック 」