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

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

他的真正含义是"或"的意思!例如:[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的意思),表示在匹配的时候忽略大小写。

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

正则表达式易错点小结!的更多相关文章

  1. Html5 canvas实现粒子时钟的示例代码

    这篇文章主要介绍了Html5 canvas实现粒子时钟的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. HTML5数字输入仅接受整数的实现代码

    这篇文章主要介绍了HTML5数字输入仅接受整数的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. HTML5 WebSocket实现点对点聊天的示例代码

    这篇文章主要介绍了HTML5 WebSocket实现点对点聊天的示例代码的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  4. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

  5. ios – 在Swift中将输入字段字符串转换为Int

    所以我非常擅长制作APP广告Swift,我试图在文本字段中做一些非常简单的输入,取值,然后将它们用作Int进行某些计算.但是’vardistance’有些东西不正确它是导致错误的最后一行代码.它说致命错误:无法解开Optional.None解决方法在你的例子中,距离是一个Int?否则称为可选的Int..toInt()返回Int?因为从String到Int的转换可能失败.请参阅以下示例:

  6. 如何在iOS中检测文本(字符串)语言?

    例如,给定以下字符串:我想检测每个声明的字符串中使用的语言.让我们假设已实现函数的签名是:如果没有检测到语言,则返回可选字符串.因此,适当的结果将是:有一个简单的方法来实现它吗?

  7. xamarin – 崩溃在AccountStore.Create().保存(e.Account,“);

    在Xamarin.Forms示例TodoAwsAuth中https://developer.xamarin.com/guides/xamarin-forms/web-services/authentication/oauth/成功登录后,在aOnAuthenticationCompleted事件中,应用程序在尝试保存到Xamarin.Auth时崩溃错误说不能对钥匙串说期待着寻求帮助.解决方法看看你

  8. ios – 将视频分享到Facebook

    我正在编写一个简单的测试应用程序,用于将视频从iOS上传到Facebook.由于FacebookSDK的所有文档都在Objective-C中,因此我发现很难在线找到有关如何使用Swift执行此操作的示例/教程.到目前为止我有这个在我的UI上放置一个共享按钮,但它看起来已禁用,从我读到的这是因为没有内容设置,但我看不出这是怎么可能的.我的getVideoURL()函数返回一个NSURL,它肯定包含视

  9. xcode – 错误“线程1:断点2.1”

    我正在研究RESTAPI管理器.这是一个错误,我无法解决它.我得到的错误在下面突出显示.当我打电话给这个班级获取资源时:我评论的线打印:Thread1:breakpoint2.1我需要修复错误的建议.任何建议都非常感谢解决方法您可能在不注意的情况下意外设置了断点.单击并拖动代表断路器外部断点的蓝色刻度线以将其擦除.

  10. ios – 更改导航栏标题swift中的字符间距

    类型的值有人可以帮我这个或建议一种不同的方式来改变swift中导航栏标题中的字符间距吗?解决方法您无法直接设置属性字符串.你可以通过替换titleView来做一个技巧

随机推荐

  1. 法国电话号码的正则表达式

    我正在尝试实施一个正则表达式,允许我检查一个号码是否是一个有效的法国电话号码.一定是这样的:要么:这是我实施的但是错了……

  2. 正则表达式 – perl分裂奇怪的行为

    PSperl是5.18.0问题是量词*允许零空间,你必须使用,这意味着1或更多.请注意,F和O之间的空间正好为零.

  3. 正则表达式 – 正则表达式大于和小于

    我想匹配以下任何一个字符:或=或=.这个似乎不起作用:[/]试试这个:它匹配可选地后跟=,或者只是=自身.

  4. 如何使用正则表达式用空格替换字符之间的短划线

    我想用正则表达式替换出现在带空格的字母之间的短划线.例如,用abcd替换ab-cd以下匹配字符–字符序列,但也替换字符[即ab-cd导致d,而不是abcd,因为我希望]我如何适应以上只能取代–部分?

  5. 正则表达式 – /bb | [^ b] {2} /它是如何工作的?

    有人可以解释一下吗?我在t-shirt上看到了这个:它似乎在说:“成为或不成为”怎么样?我好像没找到’e’?

  6. 正则表达式 – 在Scala中验证电子邮件一行

    在我的代码中添加简单的电子邮件验证,我创建了以下函数:这将传递像bob@testmymail.com这样的电子邮件和bobtestmymail.com之类的失败邮件,但是带有空格字符的邮件会漏掉,就像bob@testmymail也会返回true.我可能在这里很傻……当我测试你的正则表达式并且它正在捕捉简单的电子邮件时,我检查了你的代码并看到你正在使用findFirstIn.我相信这是你的问题.findFirstIn将跳转所有空格,直到它匹配字符串中任何位置的某个序列.我相信在你的情况下,最好使用unapp

  7. 正则表达式对小字符串的暴力

    在测试小字符串时,使用正则表达式会带来性能上的好处,还是会强制它们更快?不会通过检查给定字符串的字符是否在指定范围内比使用正则表达式更快来强制它们吗?

  8. 正则表达式 – 为什么`stoutest`不是有效的正则表达式?

    isthedelimiter,thenthematch-only-onceruleof?PATTERN?

  9. 正则表达式 – 替换..与.在R

    我怎样才能替换..我尝试过类似的东西:但它并不像我希望的那样有效.尝试添加fixed=T.

  10. 正则表达式 – 如何在字符串中的特定位置添加字符?

    我正在使用记事本,并希望使用正则表达式替换在字符串中的特定位置插入一个字符.例如,在每行的第6位插入一个逗号是什么意思?如果要在第六个字符后添加字符,请使用搜索和更换从技术上讲,这将用MatchGroup1替换每行的前6个字符,后跟逗号.

返回
顶部