以下为本篇文章全部内容:
大家好 我是叶子 sunny 的朋友
接着上面一张我们继续讲正则的元字符。
讲这一节之前 我是认为你们已经了解了第一节 中所讲的的正规规则 字符集归类了!
* 匹配任何包含零个或多个字符 或者 字符串 字符串需要括号包起来。
<script> alert(/abc*/.test("abccc")); alert(/(abc)*/.test("abcabc")); alert(/(abc)*/.test("xxx")); </script>
<?php preg_match_all('/abc*/', "abccc", $arr); var_dump($arr); preg_match_all('/(abc)*/', "abcabc", $arr); var_dump($arr);
+ 匹配任何包含一个或多个字符 或者 字符串 字符串需要括号包起来。 至少存在 1 个
<script> alert(/abc+/.test("abccc")); alert(/(abc)+/.test("abcabc")); alert(/(abc)+/.test("xxx")); </script>
<?php preg_match_all('/abc+/', "abccc", $arr); var_dump($arr); preg_match_all('/(abc)+/', "abcabc", $arr); var_dump($arr);
? 匹配0个或者1个 字符 或者 字符串 字符串需要括号包起来
<script> alert(/abc?/.test("abccc")); alert(/(abc)?/.test("abcabc")); alert(/(abc)?/.test("xxx")); </script>
<?php preg_match_all('/abc?/', "abccc", $arr); var_dump($arr); preg_match_all('/(abc)?/', "abcabc", $arr); var_dump($arr);
那么 这3个 符号的用法是 假设 你需要匹配是否存在一个字符或者字符串的时候 如果 可能出现1个或者不出现的时候 你可以用 ? 或者 * 而对于返回的结果来看 ? 只返回匹配到的第一个 而 * 则会继续匹配到无法匹配成功。
如果 你要求必须出现1次 你可以用 +
那么如果要指定匹配的数量呢
可以用
{d}
{d,d}
{d,}
d 表示要匹配的数量数字 如果 {1} 表示要匹配 1次 {1,3} 表示 1次到3次都可以 最大匹配3次 那么上面的代码可以这样用
<script> alert(/abc{2}/.test("abccc")); alert(/(abc){1}/.test("abcabc")); alert(/(abc){0,5}/.test("xxx")); </script>
<?php preg_match_all('/abc{1,}/', "abccc", $arr); var_dump($arr); preg_match_all('/(abc){1,}/', "abcabc", $arr); var_dump($arr);
你可以 理解 ? = {0,1} * = {0,} + = {1,}
然而 ? 号在正则的其他位置 还有相应的其他功能
比如 在PHP中的取名 以及忽略组 等
php 匹配后数组键名保存结果
? 数组取名(仅限PHP):
?P<name>
?<name>
?'name'
<?php preg_match('/(?P<aa>\d+)\s(?P<bb>\d+)/', 'abc 88 99 cd', $matches); print_r($matches); preg_match('/(?<aa>\d+)\s(?<bb>\d+)/', 'abc 88 99 cd', $matches); print_r($matches); preg_match("/(?'aa'\d+)\s(?'bb'\d+)/", 'abc 88 99 cd', $matches); print_r($matches);
这种将结果保存到数组键名的方式 只有PHP才能用对于 javascript 是不能这么用的
? 忽略结果保存:
有时候 我们因为要匹配一些字符串 需要用到 () 但是里面的内容 我们并不需要 也不关心 这个时候我们可以忽略结果集保存
?:
<script> var a='abc 88 99 cd'.match(/(?:\d+)\s(\d+)/); console.log(a); </script>
<?php preg_match('/(?:\d+)\s(\d+)/', 'abc 88 99 cd', $matches); print_r($matches);
上例中 对 88 这个结果 我们进行了忽略 所以获取到的数组中 没有88 这个值
?= 紧跟匹配 也就是说需要匹配这个字符的要求是 后面紧跟着的字符是一样的
<script> var a = 'sabcdef'.match(/^s(?=abcd)/); console.log(a); var b = 'abcd'.match(/^a(?=bcd)/); console.log(b); </script>
? 反向匹配 后面紧接着不能出现字符串集合
在有些情况下 我们不希望 字符串中出现一些字符
?!
<script> var a = 'abcdef'.match(/^(?!abcd)/); console.log(a); var b = 'abcd'.match(/^a(?!bcd)/); console.log(b); </script>
<?php preg_match('/^(?!abcd)/)', 'abcdef', $matches); print_r($matches); preg_match('/^a(?!bcd).*$/', 'axxxbcdef', $matches); print_r($matches); preg_match('/^a(?!bcd).*$/', 'abcdbcdef', $matches); print_r($matches);
?! 的使用注意,?! 在使用的时候 你需要确定 要比较的字符串的位置,也就是需要知道 不允许出现的字符串 是在哪个位置上,如果位置不明确 将会匹配失败。
如 ^ 没有给定的话 那么结果将是比较意外的数据。
+? 我的理解是最短的贪婪匹配 且至少匹配到1项
<script> var a = '123456789'.match(/\d+?/); console.log(a); var b = '123456789'.match(/\d+/); console.log(b); </script>
<?php preg_match('/\d+?/', '123456789', $matches); print_r($matches); preg_match('/\d+/', '123456789', $matches2); print_r($matches2);
*? 这个也是最短的贪婪匹配 可以允许不存在的情况
<script> var a = 'a1234567b89b'.match(/a[0-9b]*?b/); console.log(a); var b = 'ab'.match(/a[0-9b]*?b/); console.log(b); var c = 'a1234567b89b'.match(/a[0-9b]*b/); console.log(c); </script>
<?php preg_match('/a[0-9b]*?b/', 'a1234567b89b', $matches); print_r($matches); preg_match('/a[0-9b]*b/', 'ab', $matches1); print_r($matches1); preg_match('/a[0-9b]*b/', 'a1234567b89b', $matches2); print_r($matches2);
| 或元字符 字符串或查找
这个字符 一般是放在括号中使用如 (规则1|规则2) 它会先尝试规则1如果没有匹配到再尝试规则2 也可以直接在 整个正则表达式中使用 如 ^规则1|规则2$ 使用 这个|的时候需要注意 分界
如: aaa|b 和 aa(a|b) 是不一样的
我相信大家 都明白了 ^ 和 $ 的规则了! 我这里就不多做阐述。
^ 是从开头匹配 一般在表达式前面 如果出现在中括号[ 前面 表示 非后面的字符。
$ 是必须匹配到尾部
{} 大括号 在正则中主要是 字数指定
() 小括号 在正则中主要是 边界指定
[] 中括号 在正则中主要是 字符范围指定
\ 转义符 在正则中如要匹配 带有意义的正则字符时需要加上转移符 (因为 \ 转义符号与其他语言如PHP js 是一样的 会出现双重转义)
在PHP中 还有一个 \G 元字符 行开头元字符,一般 这个元字符 很少用,在PHP 一般是配合着偏移量来使用,
\G
<?php preg_match('@\G(yes)@', 'kkk yes ', $arr, 0, 5); print_r($arr);
总赞数量:18274
总踩数量:128087
文章数量:29