量词

量词表示要匹配的字符或表达式的数量。

尝试一下

类型

备注: 在下文中,不仅指单个字符,还包括字符类组和反向引用

字符集 意义
x*

将前面的项“x”匹配 0 次或更多次。例如,/bo*/ 匹配“A ghost booooed”中的“boooo”和“A bird warbled”中的“b”,但在“A goat grunt”中没有匹配。

x+

将前一项“x”匹配 1 次或更多次。等价于 {1,}。例如,/a+/ 匹配“candy”中的“a”和“caaaaaaandy”中的所有“a”。

x?

将前面的项“x”匹配 0 或 1 次。例如,/e?le?/ 匹配“angel”中的“el”和“angle”中的“le”。

如果立即在任何 *+?{} 量词之后使用,则使量词变为非贪婪匹配(匹配最小次数),而不是默认的贪婪匹配(匹配最大次数)。

x{n}

其中“n”是一个非负整数,与前一项“x”至少匹配“n”次。例如,/a{2}/ 不匹配“candy”中的“a”,但它匹配“caandy”中的所有“a”,以及“caaandy”中的前两个“a”。

x{n,}

其中“n”是一个非负整数,与前一项“x”至少匹配“n”次。例如,/a{2,}/ 不匹配“candy”中的“a”,但匹配“caandy”和“caaaaaaandy”中的所有 a。

x{n,m}

其中“n”和“m”为非负整数,并且 m >= n。与项“x”至少匹配“n”次,至多匹配“m”次。例如,/a{1,3}/ 不匹配“cndy”中的任何内容,而匹配“candy”中的“a”、“caandy”中的两个“a”以及“caaaaaandy”中的前三个“a”。请注意,在匹配“caaaaaandy”时,匹配的是“aaa”,尽管原始字符串中有更多的“a”。

x*?
x+?
x??
x{n}?
x{n,}?
x{n,m}?

默认情况下,像 *+ 这样的量词是“贪婪的”,这意味着它们试图匹配尽可能多的字符串。量词后面的字符 ? 使量词“不贪婪”:它一旦找到匹配就会停止。例如,给定一个字符串“some <foo> <bar> new </bar> </foo> thing”:

  • /<.*>/ 将匹配“<foo> <bar> new </bar> </foo>”
  • /<.*?>/ 将匹配“<foo>”

示例

重复模式

js
const wordEndingWithAs = /\w+a+\b/;
const delicateMessage = "This is Spartaaaaaaa";

console.table(delicateMessage.match(wordEndingWithAs)); // [ "Spartaaaaaaa" ]

统计单词

js
const singleLetterWord = /\b\w\b/g;
const notSoLongWord = /\b\w{2,6}\b/g;
const longWord = /\b\w{13,}\b/g;

const sentence = "Why do I have to learn multiplication table?";

console.table(sentence.match(singleLetterWord)); // ["I"]
console.table(sentence.match(notSoLongWord)); // [ "Why", "do", "have", "to", "learn", "table" ]
console.table(sentence.match(longWord)); // ["multiplication"]

可选字符

js
const britishText = "He asked his neighbour a favour.";
const americanText = "He asked his neighbor a favor.";

const regexpEnding = /\w+ou?r/g;
// \w+ 一个及以上字母
// o   跟随字母“o”,
// u?  可能跟随字母“u”
// r   跟随字母“r”

console.table(britishText.match(regexpEnding));
// ["neighbour", "favour"]

console.table(americanText.match(regexpEnding));
// ["neighbor", "favor"]

贪婪匹配与非贪婪匹配

js
const text = "I must be getting somewhere near the center of the earth.";
const greedyRegexp = /[\w ]+/;
// [\w ]      一个拉丁字母或一个空格
//      +     匹配一次及以上

console.log(text.match(greedyRegexp)[0]);
// "I must be getting somewhere near the center of the earth"
// 几乎所有文本都匹配(除了点字符)

const nonGreedyRegexp = /[\w ]+?/; // 注意问号
console.log(text.match(nonGreedyRegexp));
// "I"
// 尽可能少的匹配

参见