我的freeCodeCamp之旅Day---05

Regular Expressions

1. 使用测试方法

正则表达式用于编程语言以匹配字符串的一部分。您可以创建模式来帮助您进行匹配。如果你想在字符串“The dog chased the cat”中找到单词“the”,你可以使用以下正则表达式:/ /。请注意,正则表达式中不需要引号。JavaScript有多种方法可以使用正则表达式。测试正则表达式的一种方法是使用.test()方法。.test()方法接受正则表达式,将其应用于字符串(放在括号内),如果模式发现或不存在,则返回true或false。

使用.test()方法在字符串myString上应用正则表达式myRegex。:

let myString = "Hello, World!";
let myRegex = /Hello/;
let result = myRegex.test(myString); // Change this line

2. 匹配文字字符串

在上一次挑战中,您使用正则表达式/ Hello /搜索了单词“Hello”。该正则表达式搜索字符串“Hello”的文字匹配。这是另一个搜索字符串“Kevin”的文字匹配的示例:

let testStr = "Hello, my name is Kevin.";
let testRegex = /Kevin/;
testRegex.test(testStr);
// Returns true

任何其他形式的“ Kevin”都不匹配。
例如,正则表达式/Kevin/将不匹配“kevin”或“KEVIN”。

let wrongRegex = /kevin/;
wrongRegex.test(testStr);
// Returns false

3. 匹配具有不同可能性的文字字符串

使用"|"拼接多个可能性的字符串

let petString = "James has a pet cat.";
let petRegex = /dog|cat|bird|fish/; // Change this line
let result = petRegex.test(petString);

4. 匹配忽略大小写

使用i标记, 表示正则匹配忽略大小写

let myString = "freeCodeCamp";
let fccRegex = /freeCodeCamp/i; // Change this line
let result = fccRegex.test(myString);

5. Extract Matches

到目前为止,您只是检查字符串中是否存在模式。您还可以使用.match()方法提取您找到的实际匹配项。要使用.match()方法,请将该方法应用于字符串并传入括号内的正则表达式。这是一个例子:

"Hello, World!".match(/Hello/);
// Returns ["Hello"]
let ourStr = "Regular expressions";
let ourRegex = /expressions/;
ourStr.match(ourRegex);
// Returns ["expressions"]

6. Find More Than the First Match

之前都匹配都只能匹配到第一次的结果, 想要匹配出所有的结果, 使用标志g
多个标志可以并排连续书写

let twinkleStar = "Twinkle, twinkle, little star";
let starRegex = /Twinkle/gi; // Change this line
let result = twinkleStar.match(starRegex); // Change this line

7. 通配符

通配符"."将匹配任何一个字符。通配符也称为dot和period。您可以像使用正则表达式中的任何其他字符一样使用通配符。
例如,如果你想匹配“ hug”,“ huh”,“hut”和“hum”,你可以使用正则表达式/hu./来匹配所有四个单词。

let humStr = "I'll hum a song";
let hugStr = "Bear hug";
let huRegex = /hu./;
humStr.match(huRegex); // Returns ["hum"]
hugStr.match(huRegex); // Returns ["hug"]

8. 匹配一组自选字符

使用方括号"[]"将待选的字符收集起来待选

let bigStr = "big";
let bagStr = "bag";
let bugStr = "bug";
let bogStr = "bog";
let bgRegex = /b[aiu]g/;
bigStr.match(bgRegex); // Returns ["big"]
bagStr.match(bgRegex); // Returns ["bag"]
bugStr.match(bgRegex); // Returns ["bug"]
bogStr.match(bgRegex); // Returns null

这样就只能匹配"big", "bag", "bug"而不能匹配"bog".

let quoteSample = "Beware of bugs in the above code; I have only proved it correct, not tried it.";
let vowelRegex = /[aeiou]/gi; // Change this line
let result = quoteSample.match(vowelRegex); // Change this line

注意添加忽略大小写标志符"i"和全局匹配标志符"g";

9. 定义匹配范围

使用"-"表示从a到(-)b

let catStr = "cat";
let batStr = "bat";
let matStr = "mat";
let bgRegex = /[a-e]at/;
catStr.match(bgRegex); // Returns ["cat"]
batStr.match(bgRegex); // Returns ["bat"]
matStr.match(bgRegex); // Returns null

匹配多种类型:
[a-e0-5]
并排写即可

10. 否定字符集

到目前为止,您已创建了一组要匹配的字符,但您也可以创建一组您不想匹配的字符。这些类型的字符集称为否定字符集。要创建否定字符集,请在左括号后面和不想匹配的字符前放置一个插入符号(^)。
例如,/ [^ aeiou] / gi匹配所有不是元音的字符。
创建一个匹配所有不是数字或元音的字符的正则表达式。

let quoteSample = "3 blind mice.";
let myRegex = /[^0-9aeiou]/gi; // Change this line
let result = quoteSample.match(myRegex); // Change this line
console.log(result)

11. 连续或多次出现的字符

使用+, 表示至少出现一次

let difficultSpelling = "Mississippi";
let myRegex = /s+/gi; // Change this line
let result = difficultSpelling.match(myRegex);

12. 至少出现0次

使用*,表示出现0次或更多

let chewieQuote = "Aaaaaaaaaaaaaaaarrrgh!";
let chewieRegex = /aa*a/gi; // Change this line
let result = chewieQuote.match(chewieRegex);
console.log(result);

13. 贪婪匹配和懒匹配

在正则表达式中,贪婪匹配找到符合正则表达式模式的字符串的最长部分,并将其作为匹配返回。替代方案称为延迟匹配,它找到满足正则表达式模式的字符串的最小可能部分。您可以将regex / t [a-z] * i /应用于字符串“titanic”。这个正则表达式基本上是一个以t开头的模式,以i结尾,并且在它们之间有一些字母。默认情况下,正则表达式是贪婪的,因此匹配将返回[“titani”]。它找到可能适合模式的最大子串。但是,你可以使用?字符将其更改为延迟匹配。“泰坦尼克号”与调整后的正则表达式匹配/ t [a-z] *?i /返回[“ti”]。

修复regex /<.*>/以返回HTML标记

而不是文本“

冬天来了”。记住通配符。在正则表达式中匹配任何字符。

let text = "

Winter is coming

"; let myRegex = /<.*?>/; // Change this line let result = text.match(myRegex); console.log(result);

14. 匹配以特定字符串开头的字符

使用字符集内的插入符 "^" 来创建[^ thingsThatWillNotBeMatched]形式的否定字符集。
在字符集之外,插入符号用于在字符串的开头搜索模式。
注意: 只有在字符集("[]")内使用"^"才表示否定字符集

let rickyAndCal = "Cal and Ricky both like racing.";
let calRegex = /^Cal/; // Change this line
let result = calRegex.test(rickyAndCal);

15. 匹配结尾

您可以使用正则表达式末尾的美元符号字符$来搜索字符串的结尾。

let theEnding = "This is a never ending story";
let storyRegex = /story$/;
storyRegex.test(theEnding);
// Returns true
let noEnding = "Sometimes a story will have to end";
storyRegex.test(noEnding);
// Returns false

16. 匹配所有字母与数字以及_

使用字符类,您可以使用[a-z]搜索字母表中的所有字母。这种字符类很常见,它有一个快捷方式,虽然它还包含一些额外的字符。JavaScript中与字母表匹配的最接近的字符类是\ w。此快捷方式等于[A-Za-z0-9_]。此字符类匹配大写和小写字母加数字。注意,此字符类还包括下划线字符(_)。

let quoteSample = "The five boxing wizards jump quickly.";
let alphabetRegexV2 = /\w/g; // Change this line
let result = quoteSample.match(alphabetRegexV2).length;

17. 匹配非字母数字下划线

使用大写的\W

let quoteSample = "The five boxing wizards jump quickly.";
let nonAlphabetRegex = /\W/g; // Change this line
let result = quoteSample.match(nonAlphabetRegex).length

18. 数字

使用\d

let numString = "Your sandwich will be $5.00";
let numRegex = /\d/g; // Change this line
let result = numString.match(numRegex).length

19. 非数字

使用\D

let numString = "Your sandwich will be $5.00";
let noNumRegex = /\D/g; // Change this line
let result = numString.match(noNumRegex).length;

20. 匹配用户名

规则如下:
1)用户名中的唯一数字必须在最后。最后可以有零个或多个。
2)用户名字母可以是小写和大写。
3)用户名必须至少两个字符长。双字母用户名只能使用字母字母。

let username = "JackOfAllTrades";
let userCheck = /[A-z][A-z]+(\d*)$/; // Change this line
let result = userCheck.test(username);

以0位或更长的数字为结尾, 前面包含至少两个连续字母

21. 匹配换行符

迄今为止的挑战包括匹配的字母和数字字母。您还可以匹配字母之间的空格或空格。您可以使用\ s搜索空格,这是一个小写的s。此模式不仅匹配空格,还匹配回车符,制表符,换页符和换行符。你可以认为它类似于字符类[ \r \t \f \n \v ]。
更改正则表达式计数WhiteSpace以查找字符串中的多个空白字符。

let sample = "Whitespace is important in separating words";
let countWhiteSpace = /\s/g; // Change this line
let result = sample.match(countWhiteSpace);

22. 匹配非空白符

使用\S, 类似[^ \r\t\f\n\v]

let sample = "Whitespace is important in separating words";
let countNonWhiteSpace = /\S/g; // Change this line
let result = sample.match(countNonWhiteSpace);

23. 匹配规定出现次数的字符串

回想一下,您使用加号+来查找一个或多个字符,使用星号*来查找零个或多个字符。这些很方便,但有时你想要匹配一定范围的模式。您可以使用数量说明符指定模式的下限和上限。数量说明符与大括号( {和} )一起使用。您在大括号之间放置了两个数字 - 用于较低和较高的模式数。例如,为了匹配字母“ah”中出现3到5次的字母a,你的正则表达式将是/ a{3,5}h /。
更改正则表达式ohRegex以匹配单词“哦不”中的3到6个字母h。

let ohStr = "Ohhh no";
let ohRegex = /Oh{3,6}\s(no)$/; // Change this line
let result = ohRegex.test(ohStr);

24. 设置只有下线不设上限的次数匹配

您可以使用大括号指定数量说明符的较低和较高数量的模式。有时您只想指定较低数量的模式而没有上限。要仅指定较少的模式数,请保留第一个数字后跟逗号。例如,要仅匹配字符串“hah”与出现至少3次的字母a,您的正则表达式将是/ ha {3,} h /。

let haStr = "Hazzzzah";
let haRegex = /Haz{4,}ah/; // Change this line
let result = haRegex.test(haStr);

25. 匹配确定数量的某一个字符

您可以使用大括号指定数量说明符的较低和较高数量的模式。有时您只需要特定数量的匹配。要指定一定数量的模式,只需在大括号之间放置一个数字。例如,要仅将单词“hah”与字母a匹配3次,您的正则表达式将为/ ha {3} h /。

let timStr = "Timmmmber";
let timRegex = /Tim{4}ber/; // Change this line
let result = timRegex.test(timStr);

26. 检查存在或不存在的元素

您可以使用问号指定可能存在的元素?
这将检查前一个元素中的零个或一个。
您可以将此符号视为前一个元素是可选的。
例如,美式英语和英式英语略有不同,您可以使用问号来匹配两种拼写。

let american = "color";
let british = "colour";
let rainbowRegex= /colou?r/;
rainbowRegex.test(american); // Returns true
rainbowRegex.test(british); // Returns true

27. 正负的Lookahead

有两种前瞻:正向前瞻和负向前瞻。
一个积极的向前看将确保搜索模式中的元素存在,但实际上不匹配它。
正向前瞻用作(?= ...),其中......是不匹配的必需部分。
另一方面,负向前瞻将确保搜索模式中的元素不存在。
负向前瞻用作(?!...),其中......是您不希望在那里的模式。
如果不存在负前瞻部分,则返回模式的其余部分。
当需要用到多个匹配条件来匹配时, 可以用到这种操作.

let sampleWord = "astronaut";
let pwRegex = /(?=\w{5,})(?=\D*\d{2,})/; // Change this line
let result = pwRegex.test(sampleWord);

28. 使用捕获组重用模式

使用\1表示代替第一个括号内的内容
\2表示第二个,以此类推

let repeatStr = "regex regex";
let repeatRegex = /(\w+)\s\1/;
repeatRegex.test(repeatStr); // Returns true
repeatStr.match(repeatRegex); // Returns ["regex regex", "regex"]

在reRegex中使用捕获组来匹配在字符串中仅重复三次的数字,每个数字用空格分隔。

let repeatNum = "42 42 42";
let reRegex = /^(\d+)(\s)\1\2\1$/; // Change this line
let result = reRegex.test(repeatNum);
console.log(repeatNum.match(reRegex));

29. 替换操作

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

let wrongText = "The sky is silver.";
let silverRegex = /silver/;
wrongText.replace(silverRegex, "blue");
// Returns "The sky is blue."

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

"Code Camp".replace(/(\w+)\s(\w+)/, '$2 $1');
// Returns "Camp Code"

30. 移除字符串首尾的全部空格

let hello = "       Hello, Wor  ld!  x          ";
let wsRegex = /^(\s*) | (\s*)$/g; // Change this line
let result = hello; // Change this line
console.log(hello.replace(wsRegex, "").length);

首先用正则找出在头部, 或者, 尾部的不定长的空格, 记得要加上全局标志, 不然就只会找出第一个空格便终止了.
然后调用replace方法, 将匹配出来的空格用空字符串代替即可.

你可能感兴趣的:(我的freeCodeCamp之旅Day---05)