问答详情
源自:2-7 JS正则贪婪模式与非贪婪模式

感觉非贪婪模式没什么用啊?比如\d{3,6}?直接使用\d{3}不就得了

感觉非贪婪模式没什么用啊?比如\d{3,6}?直接使用\d{3}不就得了,

既然非贪婪模式只要匹配到3次成功就不会继续匹配,难道还存在不能匹配3次却可以匹配6次的例子吗,

如果有请举例出不能使用\d{3}代替\d{3,6}?的例子

提问者:慕工程2957023 2016-10-17 19:57

个回答

  • 慕妹3598491
    2017-06-16 23:13:56

    \d{3,6}?带的是一个可以改变的量词,\d{3}带的是一个确定的量词,也就是说当量词取3无法匹配,而当量词取4、5、6可以匹配时,前者返回true,后者返回false。

    那么是否存在“不能匹配3次,且可以匹配4、5、6次”的例子呢?

    例如:

    /a0{3}a/.test("a0000aa00000aa000000a")

    false

    /a0{4}a/.test("a0000aa00000aa000000a")

    true

    /a0{3,6}?a/.test("a0000aa00000aa000000a")

    true

    以此类推,可以对于任意自然数n构造出“不能匹配n次,且可以匹配(n+1)、(n+2)……次”的字符串。

    再看看下面的例子,或许您会对“量词”、“全局匹配”、“贪婪模式与懒惰模式”有更深的理解。

    "0001110011".replace(/0\d{1,3}1/,"X")

    "X10011"

    "0001110011".replace(/0\d{1,3}1/g,"X")

    "X1X"

    "0001110011".replace(/0\d{1,3}?1/,"X")

    "X110011"

    "0001110011".replace(/0\d{1,3}?1/g,"X")

    "X11X1"

    "0001110011".replace(/0\d{1}1/,"X")

    "0X110011"

    "0001110011".replace(/0\d{1}1/g,"X")

    "0X11X1"

  • 小羊杨
    2017-04-21 17:51:57

    问题的确存在“存在不能匹配3次却可以匹配6次的例子吗”这句话。
    例子:对于字符串“123aaaaaa456123aaa456”,/123\d{3,6}456/匹配的是前面的“123aaaaaa456”,而/123\d{3}456/匹配的是后面的“123aaa456”。

    也就是说,当需要匹配的字符前后有要求的时候,你觉得中间是定长还是变长能一样嘛?

    楼上说只有数字没有用也是不对的,如果限制了开始的或者结束的或者开始和结束的数字是确定的,情况也是类似的

  • 幕布斯7679853
    2017-02-19 16:20:26

    相对于只有数字在情况可能没有什么用途,但是在一段既有数字又有字母的而且长度又不一样的情况就有作用了

  • qq_噩梦_0
    2016-10-20 17:54:34

    应该用于测试吧,例如我想测这个正则,我只要加个3,6}?就可以了,不需要把{3,6}改成{3}。