了解一下正则的元字符 量词 第2部分(javascript,php)

时间: 2015-08-24 00:00 栏目: PHP 浏览: 2842 赞: 11 踩: 0 字体:

以下为本篇文章全部内容:

大家好  我是叶子 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);