正则关卡32:删除开头和结尾的空白

正则表达式测试工具

有时字符串周围存在的空白字符并不是必需的。
字符串的典型处理是删除字符串开头和结尾处的空格。

闯关:编写一个正则表达式并使用适当的字符串方法删除字符串开头和结尾的空格。
注意:.trim()方法在这里也可以实现同样的效果,但是你需要使用正则表达式来完成此项挑战。

var hello = "   Hello, World!  ";
var wsRegex = /change/; // 修改这行
var result = hello; // 修改这行
console.log(result);

正确代码

var hello = "   Hello, World!  ";
var wsRegex = /^\s+(.+[^\s])\s+$/;
var result = hello.replace(wsRegex,"$1");
console.log(result);

正则关卡31:使用捕获组搜索和替换

正则表达式测试工具

搜索功能是很有用的。
但是,当搜索同时也执行更改(或替换)匹配文本的操作时,搜索功能就会显得更加强大。
可以使用字符串上.replace()方法来搜索并替换字符串中的文本。.replace()的输入首先是想要搜索的正则表达式匹配模式,第二个参数是用于替换匹配的字符串或用于执行某些操作的函数。

var wrongText = "The sky is silver.";
var silverRegex = /silver/;
console.log( wrongText.replace(silverRegex, "blue") );
// 返回 "The sky is blue." 

你还可以使用美元符号($)访问替换字符串中的捕获组。

let res = "Code Learn".replace(/(\w+)\s(\w+)/, '$2 $1'); // 返回 "Learn Code"
console.log(res);

闯关:编写一个正则表达式,以搜索字符串"good"。然后更新变量replaceText,用字符串"okey-dokey"替换"good"

var huhText = "This sandwich is good.";
var fixRegex = /change/; // 修改这行
var replaceText = ""; // 修改这行
var result = huhText.replace(fixRegex, replaceText);
console.log(result);

正确代码

var huhText = "This sandwich is good.";
var fixRegex = /good/;
var replaceText = "okey-dokey";
var result = huhText.replace(fixRegex, replaceText);
console.log(result);

正则关卡30:使用捕获组重用模式

正则表达式测试工具

一些你所搜寻的匹配模式会在字符串中出现多次,手动重复该正则表达式太浪费了。
有一种更好的方法可以指定何时在字符串中会有多个重复的子字符串。
可以使用捕获组搜寻重复的子字符串。
括号()可以用来匹配重复的子字符串。
只需要把重复匹配模式的正则表达式放在括号中即可。
要指定重复字符串将出现的位置,可以使用反斜杠(\)后接一个数字。
这个数字从 1 开始,随着你使用的每个捕获组的增加而增加。
这里有一个示例,\1可以匹配第一个组。
下面的示例匹配任意两个被空格分割的单词:

var repeatStr = "regex regex";
var repeatRegex = /(\w+)\s\1/;
console.log( repeatRegex.test(repeatStr) ); // 返回 true
console.log( repeatStr.match(repeatRegex) ); // 返回 ["regex regex", "regex"]

在字符串上使用.match()方法将返回一个数组,其中包含它匹配的字符串及其捕获组。

闯关:在正则表达式reRegex中使用捕获组,以匹配在字符串中仅重复三次的数字,每一个都由空格分隔。

var repeatNum = "42 42 42";
var reRegex = /change/; // 修改这行
var result = reRegex.test(repeatNum);
console.log(result);

正确代码

var repeatNum = "42 42 42";
var reRegex = /^(\d+)\s\1\s\1$/;
var result = reRegex.test(repeatNum);
var result1 = repeatNum.match(reRegex);
console.log(result);
console.log(result1);

正则关卡29:检查混合字符组

正则表达式测试工具

有时候我们想使用正则表达式里的括号 () 来检查字符组。
如果想在字符串找到 Penguin 或 Pumpkin,可以这个正则表达式:/P(engu|umpk)in/g
然后使用 test() 方法检查 test 字符串里面是否包含字符组。

var testStr = "Pumpkin";
var testRegex = /P(engu|umpk)in/g;
console.log( testRegex.test(testStr) ); // 返回 true

闯关:完善正则表达式,使其以区分大小写的方式检查 Franklin Roosevelt 或 Eleanor Roosevelt 的名字,并且应该忽略 middle names。
然后完善代码,使创建的正则检查 myString,根据正则是否匹配返回 true 或 false

var myString = "Eleanor Roosevelt";
var myRegex = /False/; // 修改这行
var result = false; // 修改这行
console.log(result);

正确代码

var myString = "Eleanor Roosevelt";
var myRegex = /(Franklin|Eleanor).*Roosevelt/;
var result = myRegex.test(myString);
console.log(result);

正则关卡28:正向先行断言和负向先行断言

正则表达式测试工具

先行断言是告诉 JavaScript 在字符串中向前查找的匹配模式。
当想要在同一个字符串上搜寻多个匹配模式时,这可能非常有用。
有两种先行断言正向先行断言负向先行断言
正向先行断言会查看并确保搜索匹配模式中的元素存在,但实际上并不匹配。
正向先行断言的用法是(?=...),其中...就是需要存在但不会被匹配的部分。
另一方面,负向先行断言会查看并确保搜索匹配模式中的元素不存在。
负向先行断言的用法是(?!...),其中...是希望不存在的匹配模式。
如果负向先行断言部分不存在,将返回匹配模式的其余部分。
尽管先行断言有点儿令人困惑,但是这些示例会有所帮助。

var quit = "qu";
var noquit = "qt";
var quRegex= /q(?=u)/;
var qRegex = /q(?!u)/;
console.log( quit.match(quRegex) ); // 返回 ["q"]
console.log( noquit.match(qRegex) ); // 返回 ["q"]

先行断言的更实际用途是检查一个字符串中的两个或更多匹配模式。

这里有一个简单的密码检查器,密码规则是 3 到 6 个字符且至少包含一个数字:

var password = "abc123";
var checkPass = /(?=\w{3,6})(?=\D*\d)/;
console.log( checkPass.test(password) ); // 返回 true

闯关:在正则表达式pwRegex中使用先行断言以匹配大于5个字符且有两个连续数字的密码,并且不能以数字开头。

var sampleWord = "astronaut";
var pwRegex = /change/; // 修改这行
var result = pwRegex.test(sampleWord);
console.log(result);

正确代码

var sampleWord = "astronaut";
var pwRegex = /^(?=\w{5,})(?=\D+\d{2})/;
var result = pwRegex.test(sampleWord);
var result1 = sampleWord.match(pwRegex);
console.log(result);
console.log(result1);

正则关卡27:检查全部或无

正则表达式测试工具

有时,想要搜寻的匹配模式可能有不确定是否存在的部分。
尽管如此,还是想检查它们。
为此,可以使用问号?指定可能存在的元素。
这将检查前面的零个或一个元素。
可以将此符号视为前面的元素是可选的。
例如,美式英语和英式英语略有不同,可以使用问号来匹配两种拼写。

var american = "color";
var british = "colour";
var rainbowRegex= /colou?r/;
console.log( rainbowRegex.test(american) ); // 返回 true
console.log( rainbowRegex.test(british) ); // 返回 true

闯关:修改正则表达式favRegex以匹配美式英语(favorite)和英式英语(favourite)的单词版本。

var favWord = "favorite";
var favRegex = /change/; // 修改这行
var result = favRegex.test(favWord);
console.log(result);

正确代码

var favWord = "favorite";
var favRegex = /favou?rite/;
var result = favRegex.test(favWord);
console.log(result);