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

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