部分模式重复

现在我们已经知道如何匹配一个数字。如果我们想匹配一个整数(一个或多个数字的序列),该如何处理呢?

在正则表达式某个元素后面添加一个加号(+),表示该元素至少重复一次。因此/\d+/可以匹配一个或多个数字字符。

  1. console.log(/'\d+'/.test("'123'"));
  2. // → true
  3. console.log(/'\d+'/.test("''"));
  4. // → false
  5. console.log(/'\d*'/.test("'123'"));
  6. // → true
  7. console.log(/'\d*'/.test("''"));
  8. // → true

星号(*)拥有类似含义,但是可以匹配模式不存在的情况。在正则表达式的元素后添加星号并不会导致正则表达式停止匹配该元素后面的字符。只有正则表达式无法找到可以匹配的文本时才会考虑匹配该元素从未出现的情况。

元素后面跟一个问号表示这部分模式“可选”,即模式可能出现 0 次或 1 次。下面的例子可以匹配neighbouru出现1次),也可以匹配neighboru没有出现)。

  1. let neighbor = /neighbou?r/;
  2. console.log(neighbor.test("neighbour"));
  3. // → true
  4. console.log(neighbor.test("neighbor"));
  5. // → true

我们可以使用花括号准确指明某个模式的出现次数。例如,在某个元素后加上{4},则该模式需要出现且只能出现 4 次。也可以使用花括号指定一个范围:比如{2,4}表示该元素至少出现 2 次,至多出现 4 次。

这里给出另一个版本的正则表达式,可以匹配日期、月份、小时,每个数字都可以是一位或两位数字。这种形式更易于解释。

  1. let dateTime = /\d{1,2}-\d{1,2}-\d{4} \d{1,2}:\d{2}/;
  2. console.log(dateTime.test("30-1-2003 8:45"));
  3. // → true

花括号中也可以省略逗号任意一侧的数字,表示不限制这一侧的数量。因此{,5}表示 0 到 5 次,而{5,}表示至少五次。