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

正则关卡15:狩猎罪犯

正则表达式测试工具

一群罪犯逃出监狱逃跑,你不知道有多少人。
但是,你知道他们和其他人在一起时会保持紧密联系。
你有责任立刻找到所有的罪犯。
这里有一个示例来回顾如何做到这一点: 当字母z在一行中出现一次或连续多次时,正则表达式/z+/会匹配到它。
它会在以下所有字符串中找到匹配项:

"z"
"zzzzzz"
"ABCzzzz"
"zzzzABC"
"abczzzzzzzzzzzzzzzzzzzzzabc"

但是它不会在以下字符串中找到匹配项,因为它们中没有字母z

""
"ABC"
"abcabc"

闯关:编写一个贪婪正则表达式,在一组其他人中匹配到一个或多个罪犯。
罪犯由大写字母C表示。

var crowd = 'P1P2P3P4P5P6CCCP7P8P9';
var reCriminals = /./; // 修改这行
var matchedCriminals = crowd.match(reCriminals);
console.log(matchedCriminals);

正确代码

var crowd = 'P1P2P3P4P5P6CCCP7P8P9';
var reCriminals = /C+/g;
var matchedCriminals = crowd.match(reCriminals);
console.log(matchedCriminals);