关于正则表达式的问题?其实都是一个问题,问的详细点而已,别害怕,皇军不抢粮食。

关于正则表达式的问题?其实都是一个问题,问的详细点而已,别害怕,皇军不抢粮食。

http://img1.sycdn.imooc.com//climg/5c51e6dc00013fb713650766.jpg

  1. 为什么里面的\d,都要写成\\d,点也是\\.??

  2. 最后还整了一个模式单元图中红框,但是却用"?:"给禁止了作用?

  3. 还是最后模式单元的问题:为什么要让(\\.\\d+)这个成为模式单元,有什么特殊用处么?

  4. 还是最后模式单元的问题:最后结尾还要给模式单元加上一个?,也是说这个整体可以是不存在或者重复一次?为啥啊?

  5. 顺便问下^与$ 是指的一行的开头与结尾还是全文的开头和结尾?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

3回答
guly 2019-02-01 11:01:00

你好,1、\d  是匹配一个数字(0到9) 

\\d 前面多了第一个\ 是为了在程序中转义第二个\,这个你可以忽略

2、而是 \\.  和 \.时首先字符串中的\\被编译器解释为\ , 第一步,编译器将字符串转变为“正则表达式”,然后作为正则表达式,\.又被正则表达式引擎解释为. 第二步,才开始把第一步的结果当做是正则表达式,开始进行匹配! 如果在字符串里只写\.的话,第一步就被直接解释为.,之后作为正则表达式被解释时就变成匹配任意字符了,也是可以匹配成功。祝学习愉快!


  • 提问者 轩辕小齐V #1
    老师,我已经问得十分清楚了,您这答案并没有回到点子上啊?我问的是什么时候要\\d 什么时候要\d,你说的转义我知道啊,但是为什么我使用\d 没有错,而里面的老师使用\\d 也没错啊,我都猜想了 是不是单引号或者双引号引发的问题,您俩看没看啊?第二个问题是,可以不用写的“(?:\.\d+)? ”如此麻烦,但视频里的老师还是如此麻烦的写,有什么其他原因么?我快疯了,如果视频里的老师写得有点问题,那就有点问题,我们会了就行,如果有什么学生没领悟的麻烦您俩解释解析我们学习,谢谢! 别再绕圈子了,我是来学习的,并不是来吐槽慕课的。谢谢!
    2019-02-01 13:28:24
  • guly 回复 提问者 轩辕小齐V #2
    你好,老师已经解释了,\\d和\d 没有区别,正则匹配时,使用哪种都是可以的,视频中老师只是写了不同的方式,每个人的编程习惯而已,只要匹配正确即可。
    2019-02-01 13:40:31
好帮手慕查理 2019-01-31 18:17:13

您好,同学可以根据这段代码理解,这段代码是将正则放在了变量中,与课程中直接放在函数中的匹配结果是相同的。另外不使用\\和不添加?:的效果与使用\\和?:的效果是相同的。也就是简化后的正则也可以匹配成功。

<?php
  // $pattern = "/\\d+\\.\\d+(?:\\.\\d+)?/";
  $pattern = "/\d+\.\d+\.\d+/";
  $subject = "bundled (2.1.0 compatible)";
  $result = preg_match($pattern,$subject,$match);
  print_r($match);

关于使用\\和?:的含义,在前面的问答中已经进行了解释。

另同学说\\d与\d的结果不同,请反馈详细的代码。祝学习愉快!

  • 提问者 轩辕小齐V #1
    谢谢老师,您说“另同学说\\d与\d的结果不同,请反馈详细的代码。祝学习愉快!”这句,你怎么还要代码,莫非我表达的还不清楚,您在本次答案里也给出答案了“另外不使用\\和不添加?:的效果与使用\\和?:的效果是相同的。”(这是您原话吧?) 此外,貌似视频中老师加\\是因为用的是双引号吧? 我确实是不会,而且您这次答案又给出了一个“简化后的正则”,这是什么新鲜事物啊?我有点越老越糊涂?1. 您还是没说出来为什么视频里的老师要把正则写的这么麻烦,特别是针对于最后的".和数字"(我已经问了一万遍了,您能不能别回避呢?我是真不会啊)2.您依然没有回答为什么多一个\与少一个\没有什么变化的前提,视频里的老师还要写的这么麻烦?结果我都知道,您不必重复,谢谢您耐心回答,但还是麻烦您告诉“为什么?”
    2019-01-31 18:37:06
好帮手慕查理 2019-01-31 11:48:06

您好,1. \\d 前面多了第一个\ 是为了在程序中转义第二个\,这个你可以忽略。

2和3. (?:pattern):匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。

4. ?匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“does”或“does”中的“do”。?等价于{0,1}。并不是整体不存在或重复一次。

5.多行指的是行首和行尾。一行指开头和结尾。

祝学习愉快!

  • 提问者 轩辕小齐V #1
    老师您好,关于问题1.可以不用\\ 形式么?如果用变量存入正则,就不会出现这种情况对么?
    2019-01-31 14:17:05
  • 提问者 轩辕小齐V #2
    老师您好!关于问题2:这个正则匹配的是类似“5.0.1”的版本号,而最后的(?:\.\d+)? 匹配的是最后一部分的 ".1"(接上文的5.0.1),莫非不加就不能实现?为啥要多此一举呢?直接用\.\d不行么?这里让人非常不明白,此外老师您说的"|"在题中没有出现啊?麻烦您讲讲,特别是(?:\.\d+)? ,这种方式到底有什么特殊用处?
    2019-01-31 14:24:05
  • guly 回复 提问者 轩辕小齐V #3
    你好,首先字符串中的\\被编译器解释为\ , 第一步,编译器将字符串转变为“正则表达式”,然后作为正则表达式,\.又被正则表达式引擎解释为. 第二步,才开始把第一步的结果当做是正则表达式,开始进行匹配! 如果在字符串里只写\.的话,第一步就被直接解释为.,之后作为正则表达式被解释时就变成匹配任意字符了,也是可以匹配成功。祝学习愉快!
    2019-01-31 15:01:33
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师