量词 +, *, ? 和 {n}

164 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情

假设我们有一个像这样 +7(903)-123-45-67 的字符串,并想要找到其中所有数字。但与之前不同的是,我们对单个数字不感兴趣,只对全数感兴趣:7, 903, 123, 45, 67

数字是一个或多个数字 \d 的序列。为了标记我们需要的数量,我们需要加一个 量词

数量 {n}

最简单的量词便是大括号中的数字:{n}

在一个字符(或一个字符类,或 [...] 等)后附加一个量词,用来指出我们具体需要的数量。

它有一些高级的形式,让我们看一些例子:

  • 确切的位数:{5}

    \d{5} 表示 5 位数,与 \d\d\d\d\d 相同。

    下面这个例子查找一个五位数的数字:

    alert( "I'm 12345 years old".match(/\d{5}/) ); //  "12345"
    

    我们可以添加 \b 来排除位数更多的数字:\b\d{5}\b

  • 范围:{3,5},匹配 3-5 个

    要查找 3-5 位的数字,我们可以将限制写在花括号中:\d{3,5}

    alert( "I'm not 12, but 1234 years old".match(/\d{3,5}/) ); // "1234"
    

    我们可以省略上限。

    那么正则表达式 \d{3,} 就会查找位数大于等于 3 的数字:

    alert( "I'm not 12, but 345678 years old".match(/\d{3,}/) ); // "345678"
    

让我们回到字符串 +7(903)-123-45-67

我们如果需要一个及以上的数字,就使用 \d{1,}

let str = "+7(903)-123-45-67";

let numbers = str.match(/\d{1,}/g);

alert(numbers); // 7,903,123,45,67

缩写

大多数常用的量词都有简写形式:

  • +

    代表“一个或多个”,与 {1,} 相同。

    例如,\d+ 用来查找所有数字:

    let str = "+7(903)-123-45-67";
    
    alert( str.match(/\d+/g) ); // 7,903,123,45,67
    
  • ?

    代表“零个或一个”,与 {0,1} 相同。换句话说,它使得符号变得可选。

    例如,模式 ou?r 查找 o,后跟零个或一个 u,然后是 r

    所以 colou?r 会找到 color 和 colour

    let str = "Should I write color or colour?";
    
    alert( str.match(/colou?r/g) ); // color, colour
    
  • *

    代表“零个及以上”,与 {0,} 相同。也就是说,字符可以出现任何次数或者不出现。

    例如,\d0* 查找一个数字后面跟着任意数量的零(可能有很多或没有)的数字:

    alert( "100 10 1".match(/\d0*/g) ); // 100, 10, 1
    

    将其与 +(一个或更多)做比较:

    alert( "100 10 1".match(/\d0+/g) ); // 100, 10
    // 1 没有被匹配出来,因为 0+ 要求至少有一个 0