正则关卡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);

正则关卡20:匹配所有非数字

正则表达式测试工具

我们可以使用带有小写d的缩写\d来搜寻数字。
我们也可以使用类似的缩写来搜寻非数字,该缩写使用大写的D
查找非数字字符的缩写是\D

这等同于字符串[^0-9],它查找不是 0 – 9 之间数字的单个字符。

var str = "This building is 400 meters high.";
var reg1 = /\D/;
var reg2 = /[^0-9]/;
console.log( str.match(reg1) ); // 返回 ["T"]
console.log( str.match(reg2) ); // 返回 ["T"]

闯关:使用非数字缩写\D来计算电影标题中有多少非数字。

var movieName = "2001: A Space Odyssey";
var noNumRegex = /change/; // 修改这行
var result = movieName.match(noNumRegex);
console.log(result);

正确代码

var movieName = "2001: A Space Odyssey";
var noNumRegex = /\D/g;
var result = movieName.match(noNumRegex);
console.log(result);

正则关卡19:匹配所有数字

正则表达式测试工具

另一个常见的匹配模式是只寻找数字。
查找数字字符的缩写是\d,注意是小写的d
这等同于元字符[0-9],它查找 0 到 9 之间任意数字的单个字符。

var str = "This building is 400 meters high.";
var reg1 = /\d/;
var reg2 = /[0-9]/;
console.log( str.match(reg1) ); // 返回 ["4"]
console.log( str.match(reg2) ); // 返回 ["4"]

闯关:使用缩写\d来计算电影标题中有多少个数字。
书面数字(”six” 而不是 6)不计算在内。

var movieName = "2001: A Space Odyssey";
var numRegex = /change/; // 修改这行
var result = movieName.match(numRegex);
console.log(result);

正确代码

var movieName = "2001: A Space Odyssey";
var numRegex = /\d/g;
var result = movieName.match(numRegex);
console.log(result);

正则关卡18:匹配所有的字母和数字

正则表达式测试工具

使用​元字符​,可以使用[a-z]搜寻字母表中的所有字母。
这种元字符是很常见的,它有一个缩写,但这个缩写也包含额外的字符。
JavaScript 中与字母表匹配的最接近的元字符是\w,这个缩写等同于[A-Za-z0-9_]
它不仅可以匹配大小写字母和数字,​注意​,它还会匹配下划线字符(_)。

var longHand = /[A-Za-z0-9_]+/;
var shortHand = /\w+/;
var numbers = "58";
var varNames = "important_var";

console.log( longHand.test(numbers) ); // 返回 true
console.log( shortHand.test(numbers) ); // 返回 true
console.log( longHand.test(varNames) ); // 返回 true
console.log( shortHand.test(varNames) ); // 返回  true

闯关:使用缩写\w来计算所有引号中字母和数字字符的数量。

var quoteSample = "The five boxing wizards jump quickly.";
var alphabetRegexV2 = /change/; // 修改这行
var result = quoteSample.match(alphabetRegexV2);
console.log(result);

正确代码

var quoteSample = "The five boxing wizards jump quickly.";
var alphabetRegexV2 = /\w/g;
var result = quoteSample.match(alphabetRegexV2);
console.log(result);

正则关卡17:匹配字符串的末尾

正则表达式测试工具

在上一个挑战中,学习了使用^符号来搜寻字符串开头的匹配模式。
还有一种方法可以搜寻字符串末尾的匹配模式。
可以使用正则表达式的美元符号$来搜寻字符串的结尾。

var theEnding = "This is a never ending story";
var storyRegex = /story$/;
console.log( storyRegex.test(theEnding) ); // 返回 true

var noEnding = "Sometimes a story will have to end";
console.log( storyRegex.test(noEnding) ); // 返回 false

闯关:使用$在字符串caboose的末尾匹配"caboose"

var caboose = "The last car on a train is the caboose";
var lastRegex = /change/; // 修改这行
var result = lastRegex.test(caboose);
console.log(result);

正确代码

var caboose = "The last car on a train is the caboose";
var lastRegex = /caboose$/;
var result = lastRegex.test(caboose);
console.log(result);

正则关卡16:匹配字符串的开头

正则表达式测试工具

在之前的挑战中,使用字符集中的插入符号(^)来创建一个否定字符集,形如[^thingsThatWillNotBeMatched]
字符集之外,插入 ^符号匹配输入字符串的开始位置。

var firstString = "Loen is first and can be found.";
var firstRegex = /^Loen/;
console.log( firstRegex.test(firstString) ); // 返回 true

var notFirst = "You can't find Loen now.";
console.log( firstRegex.test(notFirst) ); // 返回 false

闯关:在正则表达式中使用^符号,以匹配仅在字符串rickyAndCal的开头出现的"Cal"

var rickyAndCal = "Cal and Ricky both like racing.";
var calRegex = /change/; // 修改这行
var result = calRegex.test(rickyAndCal);
console.log(result);

正确代码

var rickyAndCal = "Cal and Ricky both like racing.";
var calRegex = /^Cal/;
var result = calRegex.test(rickyAndCal);
console.log(result);