正则表达式易错点小结!

最近在学习正则表达式,发现原来理解的正则表达式不是特别的准确,甚至有误!在这里简单记录一下,希望对有的朋友能够有所帮助!

①“[]”:字符集(字符簇,字符组……)

他的真正含义是"或"的意思!例如:[123],它代表的含义是,匹配一个1或2或3!

由于它经常是用于匹配多个可能的值,所以支持一种简写的方式! 例如:[12345678]可以简写为[1-8]
[abcdefghjik]可以简写为[a-k] [1234567ABCDEFG]可以简写为[1-7A-G]

“[]”相关的陷阱!

(1)在”[]”中的大部分元字符都是普通字符,都不在具有元字符的含义!但是仍然有个别的元字符除外!
“-”,“^”,目前只知道这两个,可能还有其他的,待补充!

“-”,是作为连字符表示的是一个范围,

  1. 如果单独的将“-”符号放在第一位的话,它表示的也是一个普通的字符!例如:[a-z]这个时候就是元字符,代表的是一个范围!

  2. 在[-abc]中,"-"就是一个普通的字符,这句话就表示,匹配-、a、b、c中,这四个字符中的任意一个!

^有两个意思,

  1. 在字符簇外,它表示的是托字节,匹配的是一个位置!

  2. 而在字符簇中相当于取反的意思!而且只有当托字节放在字符簇的第一个位置的时候才会表示一个元字符!

<?php
    $str =<<<STR
        Iraq
        Iraqian
        miqra
        qintar
        aoph
        zaqqnum
STR;
    $reg = '/q[^udfg]/';
    preg_match_all($reg,$str,$result);
    var_dump($result);

    运行结果如下
    array(1) { [0]=>array(5) { [0]=> string(2) "q " [1]=> string(2) "qi"[2]=> string(2) "qr" [3]=> string(2) "qi" [4]=>string(2) "qq" } }
?>
曾经好长一段时间,我个人一直认为,[^udfg]匹配的是除了udfg中的任何一个字符,但是,很明显我错了! 通过上面我们对“[]”的了解,字符簇永远匹配的是**一个**字符!所以,他的正解应该是,匹配除了字符u外的任意一个字符,或者dfg中的任何一个字符!

可能会有的朋友问Iraq中q后面匹配了什么!答案是回车(在window状态下是\r\n)!\r并不属于u所以匹配成功!
在heredoc的语法中,会完整的保留空格、制表符、回车换行!

②“|”表示或的意思!它代表一个分支语句!

到这里,可能有的朋友会问,那他的功能岂不是和 ”[]” 的功能重复了么?

答案显然是否定的!个人认为“|”,分支语句,在一定程度上弥补了“[]”符号功能的不足!因为“[]”,自始至终只能表示一个字字符!

例如:[a-z],他表示的匹配a-z中的任意一个字符!

而当我们需要匹配abc或def的时候,显然”[]”是无能为力的!而此时也正是“|”分支结构的用处!可以写成(abc|def)

表示匹配abc或者def这两个字符集中的一个!

③“?”表示可选项!它只作用于之前紧邻的元素!

这里我们需要明白一下元素的概念!所谓元素还包括如下的形式:[a-z]这个字符簇整体表示一个元素!(abc|def)这个分支结构整体表示一个元素!
注意:所有的量词都是仅作用于之前紧邻的元素!

④正则中的反向引用

在正则表达式中,使用”()”包裹起来的元素被统一称为子表达式!而括号是能够记忆“()”匹配到的内容的,无论这些匹配到的文本是什么!(这个也就是我们常说的反向引用!如果他是第一个的话使用1,就可以获得字表达式中的内容!)
那么如果判断是表达式几呢?有一个原则:按照开括号“(”从左到右的出现顺序进行计算!依次就是1,2,3…… 注意:反向引用应该是可以嵌套的!遵循的同样是这个原则!看代码:

<?php
    $content = 'maweibin is the author';
    $regexp = "/(((ma)wei)bin)/";
    preg_match($regexp,$content,$result);
    var_dump($result);
    运行结果如下:
    array(4) { [0]=> string(8) "maweibin" [1]=> string(8) "maweibin" [2]=> string(5) "mawei" [3]=> string(2) "ma" } 
?>

通过结果,我们可以看到,第一个字表达式是“maweibin”,第二个字表达式是“mawei”,第三个字表达式是“ma”。

⑤正则表达式中的“$”陷阱!

在正则表达式中“$”符号,同托字节“^”一样是匹配一个位置的!但是“$”符号本身又有一些陷阱需要我们注意!
一般情况下,我们都认为“$”符号匹配就是一行中的最后一个位置!这个并没有错,但是不够详细!
其实$匹配的是这样一个位置,匹配n前或单行字串的结束位置,单行字符串结尾什么都没有!举例说明:

<?php
$str =<<<STR
the theory
my myselef
your yourselef
STR;
$reg = '/^([a-zA-Z]+)\s*\1[a-zA-Z]*$/m';
preg_match_all($reg,$result);
var_dump($result);
运行的结果如下array(2) { [0]=> array(1) { [0]=>string(14) "your yourselef" } [1]=> array(1) { [0]=> string(4)"your" } }
?>

只有最后一个被匹配到了! 、
原因是这样的!在window中每换一行会有隐藏字符“rn”存在!
$匹配n前或字串结尾(字符串结尾,比如单独一行的最后),r 也是一个字符,且不在[a-zA-Z]范围!其实,我们只需要将正则改写为'/^([a-zA-Z]+)s1[a-zA-Z] s$/m',这里只是加上了一个s用来匹配r这个看不见的字符串!

⑥关于正则表达在多行匹配中的应用!

正则表达式大多数情况下是进行单行的匹配的!但是,有时候我们也需要进行多行的匹配,特别是在我们进行信息采集的时候,显得就尤为重要!
个人认为,在php中如果我们能够灵活的运用php的模式修饰符,那么多行匹配就没有什么问题了!所以多行匹配,个人认为就是重点对模式修饰符的学习!

(1)m(mutiline),加上了m修饰符号的主要作用是更改了托字节”^”和“$”的应用范围!
黑色箭头代表的是托字节”^”所匹配的位置,蓝色箭头是美元符号”%”所匹配的位置! 举例说明:

从上面,我们可以看出来:在没有m修饰符的时候,托字节^仅匹配字符串的开始位置,
而$仅匹配字符串的末尾,或者最后的换行符号!
加上了m修饰符之后:

从上面,我们可以看出来:加上m修饰符后,托字节^会匹配目标字符串的开始,或者任意换行符n前面的位置; 而$会匹配目标字符串的最末位置,或者任意换行符后面的位置!
(2)S修饰,如果设置了这个修饰符那么,模式中的元字符 “ . ” 就会匹配所有字符,包含换行符. 如果没有这个修饰符,那么 “ . ”实际上匹配的是除了换行符n外的任意字符!

(3)U(这个是大写的ungreedy:非贪婪)。

举例说明:
<a href=’www.baidu.com’>百度</a><a href=’www.google.com’>谷歌</a>
正则如下:<a\s*href\s*=\s*’www\.baidu\.com’>.*</a>结果是把全部的字符串都匹配到了!其实,我们只需要加上U修饰符,这样,这样一旦成功匹配一次的话,正则就不会继续进行匹配了!

(4)i(个人认为应该是ingnore的意思),表示在匹配的时候忽略大小写。

⑦正则表达式是从左到右依次匹配的!这也是学习正则表达式要遵守的基本原则!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


jquery.validate使用攻略(表单校验) 目录 jquery.validate使用攻略1 第一章&#160;jquery.validate使用攻略1 第二章&#160;jQuery.validate.js API7 Custom selectors7 Utilities8 Validato
/\s+/g和/\s/g的区别 正则表达式/\s+/g和/\s/g,目的均是找出目标字符串中的所有空白字符,但两者到底有什么区别呢? 我们先来看下面一个例子: let name = &#39;ye wen jun&#39;;let ans = name.replace(/\s/g, &#39;&#3
自整理几个jquery.Validate验证正则: 1. 只能输入数字和字母 /^[0-9a-zA-Z]*$/g jQuery.validator.addMethod(&quot;letters&quot;, function (value, element) { return this.optio
this.optional(element)的用法 this.optional(element)是jquery.validator.js表单验证框架中的一个函数,用于表单控件的值不为空时才触发验证。 简单来说,就是当表单控件值为空的时候不会进行表单校验,此函数会返回true,表示校验通过,当表单控件
jQuery.validate 表单动态验证 实际上jQuery.validate提供了动态校验的方法。而动态拼JSON串的方式是不支持动态校验的。牺牲jQuery.validate的性能优化可以实现(jQuery.validate的性能优化见图1.2 jQuery.validate源码 )。 也可
自定义验证之这能输入数字(包括小数 负数 ) &lt;script type=&quot;text/javascript&quot;&gt; function onlyNumber(obj){ //得到第一个字符是否为负号 var t = obj.value.charAt(0); //先把非数字的都
// 引入了外部的验证规则 import { validateAccountNumber } from &quot;@/utils/validate&quot;; validator.js /*是否合法IP地址*/ export function validateIP(rule, value,cal
VUE开发--表单验证(六十三) 一、常用验证方式 vue 中表单字段验证的写法和方式有多种,常用的验证方式有3种: data 中验证 表单内容: &lt;!-- 表单 --&gt; &lt;el-form ref=&quot;rulesForm&quot; :rules=&quot;formRul
正则表达式 座机的: 例子: 座机有效写法: 0316-8418331 (010)-67433539 (010)67433539 010-67433539 (0316)-8418331 (0316)8418331 正则表达式写法 0\d{2,3}-\d{7,8}|\(?0\d{2,3}[)-]?\d
var reg = /^0\.[1-9]{0,2}$/;var linka = 0.1;console.log (reg.test (linka)); 0到1两位小数正则 ^(0\.(0[1-9]|[1-9]{1,2}|[1-9]0)$)|^1$ 不含0、0.0、0.00 // 验证是否是[1-10
input最大长度限制问题 &lt;input type=&quot;text&quot; maxlength=&quot;5&quot; /&gt; //可以 &lt;input type=&quot;number&quot; maxlength=&quot;5&quot; /&gt; //没有效
js输入验证是否为空、是否为null、是否都是空格 目录 1.截头去尾 trim 2.截头去尾 会去掉开始和结束的空格,类似于trim 3.会去掉所有的空格,包括开始,结束,中间 1.截头去尾 trim str=str.trim(); // 强烈推荐 最常用、最实用 or $.trim(str);
正则表达式语法大全 字符串.match(正则):返回符合的字符串,若不满足返回null 字符串.search(正则):返回搜索到的位置,若非一个字符,则返回第一个字母的下标,若不匹配则返回-1 字符串.replace(正则,新的字符串):找到符合正则的内容并替换 正则.test(字符串):在字符串中
正整数正则表达式正数的正则表达式(包括0,小数保留两位): ^((0{1}.\d{1,2})|([1-9]\d.{1}\d{1,2})|([1-9]+\d)|0)$正数的正则表达式(不包括0,小数保留两位): ^((0{1}.\d{1,2})|([1-9]\d.{1}\d{1,2})|([1-9]+
JS 正则验证 test() /*用途:检查输入手机号码是否正确输入:s:字符串返回:如果通过验证返回true,否则返回false /function checkMobile(s){var regu =/[1][3][0-9]{9}$/;var re = new RegExp(regu);if (r
请输入保留两位小数的销售价的正则: /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/ 1.只能输入英文 &lt;input type=&quot;text&quot; onkeyup=&quot;value
判断价格的正则表达式 价格的正则表达式 /(^[1-9]\d*(\.\d{1,2})?$)|(^0(\.\d{1,2})?$)/; 1 解析:价格符合两种格式 ^ [1-9]\d*(.\d{1,2})?$ : 1-9 开头,后跟是 0-9,可以跟小数点,但小数点后要带上 1-2 位小数,类似 2,2
文章浏览阅读106次。这篇文章主要介绍了最实用的正则表达式整理,比如校验邮箱的正则,号码相关,数字相关等等,本文给大家列举的比较多,需要的朋友可以参考下。_/^(?:[1-9]d*)$/ 手机号
文章浏览阅读1.2k次。4、匹配中的==、an==、== an9、i9 == "9i"和99p==请注意下面这部分的作用,它在匹配中间内容的时候排除了说明:当html字符串如下时,可以匹配到两处,表示匹配的字符串不包含and且不包含空白字符。说明:在上面的正则表达式中,_gvim正则表达式匹配不包含某个字符串
文章浏览阅读897次。【代码】正则表达式匹配a标签的href。_auto.js 正则匹配herf