正则关卡26:指定匹配的确切数量

正则表达式测试工具

可以使用带有花括号的数量说明符来指定匹配模式的上下限。
但有时只需要特定数量的匹配。
要指定一定数量的匹配模式,只需在大括号之间放置一个数字。
例如,要只匹配字母a出现3次的单词"hah",正则表达式应为/ha{3}h/

var A4 = "haaaah";
var A3 = "haaah";
var A100 = "h" + "a".repeat(100) + "h";
var multipleHA = /ha{3}h/;
console.log( multipleHA.test(A4) ); // 返回 false
console.log( multipleHA.test(A3) ); // 返回 true
console.log( multipleHA.test(A100) ); // 返回 false

闯关:修改正则表达式timRegex,以匹配仅有四个字母单词m的单词"Timber"

var timStr = "Timmmmber";
var timRegex = /change/; // 修改这行
var result = timRegex.test(timStr);
console.log(result);

正确代码

var timStr = "Timmmmber";
var timRegex = /Tim{4}ber/;
var result = timRegex.test(timStr);
console.log(result);

正则关卡25:只指定匹配的下限

正则表达式测试工具

可以使用带有花括号的数量说明符来指定匹配模式的上下限。
但有时候只想指定匹配模式的下限而不需要指定上限。
为此,在第一个数字后面跟一个逗号即可。

要匹配出现3次或​3​次以上的字母a的正则表达式应该是/a{3,}/

例如:

var A4 = "haaaah";
var A2 = "haah";
var A100 = "h" + "a".repeat(100) + "h";
var multipleA = /ha{3,}h/;
console.log( multipleA.test(A4) ); // 返回 true
console.log( multipleA.test(A2) ); // 返回 false
console.log( multipleA.test(A100) ); // 返回 true

闯关:修改正则表达式haRegex,匹配包含四个或更多字母z的单词"Hazzah"

var haStr = "Hazzzzah";
var haRegex = /change/; // 修改这行
var result = haRegex.test(haStr);
console.log(result);

正确代码

var haStr = "Hazzzzah";
var haRegex = /Haz{4,}ah/;
var result = haRegex.test(haStr);
console.log(result);

正则关卡24:指定匹配的上限和下限

正则表达式测试工具

回想一下,使用加号+查找一个或多个字符,使用星号*查找零个或多个字符。
这些都很方便,但有时需要匹配一定范围的匹配模式。
可以使用数量说明符指定匹配模式的上下限。
数量说明符与花括号({})一起使用。
可以在花括号之间放两个数字,这两个数字代表匹配模式的上限和下限。
例如,要在字符串"ah"中匹配仅出现35次的字母a,正则表达式应为/a{3,5}h/

var A4 = "aaaah";
var A2 = "aah";
var multipleA = /a{3,5}h/;
console.log( multipleA.test(A4) ); // 返回 true
console.log( multipleA.test(A2) ); // 返回 false

闯关:修改正则表达式ohRegex以匹配在"Oh no"中仅出现36次的字母h

var ohStr = "Ohhh no";
var ohRegex = /change/; // 修改这行
var result = ohRegex.test(ohStr);
console.log(result);

正确代码

var ohStr = "Ohhh no";
var ohRegex = /Oh{3,6}\sno/;
var result = ohRegex.test(ohStr);
console.log(result);

正则关卡23:匹配非空白字符

正则表达式测试工具

已经学会了如何使用带有小写s的缩写\s来搜寻空白字符。
还可以搜寻除了空格之外的所有内容。
使用\S搜寻非空白字符,其中S是大写。
此匹配模式将不匹配空格、回车符、制表符、换页符和换行符。
可以认为这类似于元字符[^\r\t\f\n\v]

let whiteSpace = "Whitespace. Whitespace everywhere!"
let nonSpaceRegex = /\S/g;
console.log( whiteSpace.match(nonSpaceRegex).length ); // 返回 32

闯关:修改正则表达式countNonWhiteSpace以查找字符串中的多个非空字符。

var sample = "Whitespace is important in separating words";
var countNonWhiteSpace = /change/; // 修改这行
var result = sample.match(countNonWhiteSpace);
console.log(result);

正确代码

var sample = "Whitespace is important in separating words";
var countNonWhiteSpace = /\S/g;
var result = sample.match(countNonWhiteSpace);
console.log(result);

正则关卡22:匹配空白字符

正则表达式测试工具

接下来我们学习匹配字母之间的空格。
可以使用\s搜寻空格,其中s是小写。
此匹配模式不仅匹配空格,还匹配回车符、制表符、换页符和换行符,可以将其视为与[\r\t\f\n\v]类似。

var whiteSpace = "Whitespace. Whitespace everywhere!"
var spaceRegex = /\s/g;
console.log( whiteSpace.match(spaceRegex) ); // 返回 [" ", " "] 

闯关:修改正则表达式countWhiteSpace查找字符串中的多个空白字符。

var sample = "Whitespace is important in separating words";
var countWhiteSpace = /change/; // 修改这行
var result = sample.match(countWhiteSpace);
console.log(result);

正确代码

var sample = "Whitespace is important in separating words";
var countWhiteSpace = /\s+/g;
var result = sample.match(countWhiteSpace);
console.log(result);

正则关卡21:限制可能的用户名

正则表达式测试工具

用户名在互联网上随处可见。
它们是用户在自己喜欢的网站上的唯一身份。
需要检索数据库中的所有用户名。
以下是用户在创建用户名时必须遵守的一些简单规则。
1) 用户名只能是数字字母字符。
2) 用户名中的数字必须在最后,且数字可以有零个或多个。
3) 用户名字母可以是小写字母和大写字母。
4) 用户名长度必须至少为两个字符。
两位用户名只能使用字母。

闯关:修改正则表达式userCheck以适合上面列出的约束。

var username = "JackOfAllTrades";
var userCheck = /change/; // 修改这行
var result = userCheck.test(username);
console.log(result);

正确代码

var username = "JackOfAllTrades";
var userCheck = /^[a-z]([0-9]{2,}|[a-z]+\d*)$/i; // 修改这行
var result = userCheck.test(username);
var result1 = username.match(userCheck);
console.log(result);
console.log(result1);