學好正規表示式需要注意的幾點

2022-08-11 20:24:11 字數 1704 閱讀 4463

關於preg_match 和preg_match_all 函式結果的說明

php**為:

<?php

$str = "sdh111-757-111fkjhgjkiu888-060-888ygndfhdsuifyiud";

$reg = '/(\d)\1-(\d)\d\2-\1/i';

//preg_match($reg,$str,$res);

preg_match_all($reg,$str,$res);

var_dump($res);

?>

preg_match結果為:

array

[0] => 111-575-111

[1] => 1

[2] => 5

如果使用的是preg_match函式,匹配的結果是,只匹配乙個結果

$res[0] 就是匹配到的內容

$reg[1] 就是第乙個子表示式的內容

$reg[n] 就是第n個子表示式的內容

preg_match_all結果為

1:子表示式

就是在正規表示式中()裡面的表示式,這些括號中的表示式匹配到的元素,會**獲到記憶體中,就是上面preg_match和preg_match匹配的陣列中除第乙個以外的陣列部分。

2:捕獲 (請注意,如果你的正規表示式中有子表示式,則,正規表示式使用單引號括起來)

3:反向引用

上面的例子中的這個正規表示式:

$reg = '/(\d)\1-(\d)\d\2-\1/i';

這個正規表示式中就用到了反向引用,其中  \1   \2   都是反向引用,代表的是第乙個、第二個子表示式匹配到的內容。

特殊的說明:

在正則規範中,我們可能會 看到 (?: pattern) (?! patter) (?(?: pattern) 非捕獲匹配

這些特殊的表示式是正則中的  環視 有興趣可以網上搜尋學習。

表示式           說明

(?<=pattern) 逆序肯定環視,表示所在位置左側能夠匹配expression

(?(?=pattern)   順序肯定環視,表示所在位置右側能夠匹配expression

(?!pattern)    順序否定環視,表示所在位置右側不能匹配expression

參考說明文件:

(?:pattern)      匹配 pattern 但不獲取匹配結果,也就是說這是乙個非獲取匹配,不進行儲存供以後使用。這在使用 "或" 字元 (|) 來組合乙個模式的各個部分是很有用。例如, 'industr(?:y|ies) 就是乙個比 'industry|industries' 更簡略的表示式。

(?!pattern)      負向預查,在任何不匹配 pattern 的字串開始處匹配查詢字串。這是乙個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。例如'windows (?!95|98|nt|2000)' 能匹配 "windows 3.1" 中的 "windows",但不能匹配 "windows 2000" 中的 "windows"。預查不消耗字元,也就是說,在乙個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜尋,而不是從包含預查的字元之後開始

筆記 QT正規表示式要注意的東西

可能是轉義字元再次轉義的問題,也有可能是qstring再次使用會自己新增一對雙引號的問題,反正這樣用就沒問題了。qstring global operator decode nodes qstring node text qregexp vap pattern 同樣的東西輸出也不一樣,這樣子輸出沒有...

正規表示式的注意點

先說遇到的問題,const numberregexp d g const isnumber v numberregexp.test v isnumber 22 true isnumber 22 false驚呆了,不是同乙個正則嗎?怎麼可能啊?全域性匹配 g 上面的問題就是使用了全域性匹配,帶來的影響...

正規表示式中有關 b 的幾點注意事項

正規表示式中的 b可以用來單詞的邊界。單詞的前邊界,或者是後邊界,或者是同時。基礎用法略去不提,在 b的使用中有這樣幾點是需要格外注意的。像 b mentioned 這樣的表達是無法匹配出 mentioned 這樣的字串的。所以請不要嘗試在提取出的微博的文字中使用 b b 這樣的方式提取被 的使用者...