正则表达式又称正则速成课程
#javascript #regex

正则又名正则表达式

正则表达式(也称为“正则”)是有助于搜索,匹配或替换字符串中字符组合的模式。他们真的很强大,很难同时阅读。许多开发人员只是决定在他们的学习路径中跳过这一部分,并通过搜索搜索或从堆栈溢出中复制/粘贴已经准备好的正则表达式。

您应该牢记以下事实:正则语法在不同的编程语言之间有所不同。您可以在下面
查找将无缝用于JavaScript的示例 - 对于Python或PHP,语法可能需要一些调整。

基本

要在字符串That’s what she said.中找到she词,您只需使用以下正则表达式:/she/

在JavaScript中,与字符串方法集成在一起。要查找Regex是否匹配字符串,您可以
返回truefalse.test()方法。

let michaelScott = "That's what she said.";
let regex = /she/;
regex.test(michealScott) // true

让我们学习一些基本操作员:

  • 选择任何角色,包括特殊的电荷和空间,使用时期.
let str = "abcABC012 .:!?"
let regex = /./g // array of matches: a,b,c,A,B,C,0,1,2, ,.,:,!,?
  • 在字符串开始时选择字符使用caret sign ^
let str = "abcdef"
let regex1 = /^abc/ // array of matches: a,b,c
let regex2 = /^def/ // no matches
  • 在字符串末尾选择字符使用美元符号$
let string = "abcdef"
let regex1 = /abc$/ // no matches
let regex2 = /def$/ // array of matches: d,e,f

// you can combine two of those:
let regex1 = /^abc$/
  • 选择至少一个定义的字符添加+
let string = "abc bc aaabc"
let regex = /a+/g // array of matches: a,aaa
  • 指定我们需要多少个字符,我们可以使用量词{n}。您可以定义确切的计数:{2}{2,4)的范围匹配2-4次:
let string = "12 3456"
let regex1 = /\d{4}/ // array of matches: 3456
let regex2 = /\d{2,4}/g // array of matches: 12,3456

查找字母,数字等

  • 选择字母a-z, A-Z,数字0-9和下划线_字符使用\w。找到除这些的炭子 使用\W
let string = "abcABC123 _.:!?"
let regex1 = /\w/g // array of matches: a,b,c,A,B,C,1,2,3,_
let regex2 = /\W/g // array of matches:  ,.,:,!,?
  • 缩小我们的搜索范围并仅找到数字字符\d和其他所有内容kude19:
let string = "abcABC123 _.:!?"
let regex1 = /\d/g // array of matches: 1,2,3
let regex2 = /\D/g // array of matches: a,b,c,A,B,C, ,_,.,:,!,?
  • 您还可以使用\s选择空间字符:
let string = "abcABC123 _.:!?"
let regex1 = /\s/g // array of matches: " "
let regex2 = /\S/g // array of matches: a,b,c,A,B,C,1,2,3,_,.,:,!,?
  • 也可以选择新的行字符\n或tabulator \t

角色集和范围

您可以在Square Brackets [...]中搜索任何字符。

let string = "mop hop top cop"
let regex = /[mtc]op/g // array of matches: mop,top,cop

使用caret ^允许否定定义的字符集:

let string = "mop hop top cop"
let regex = /[^mt]op/g // array of matches: hop,cop

通过定义起始字母和结尾字母,您可以在指定范围内找到字母:

let string = "abcdefghijklmnopq"
let regex = /[d-i]/g // array of matches: d,e,f,g,h,i

// and the same with numbers
let string = "0123456789"
let regex = /[2-7]/g // array of matches: 2,3,4,5,6,7

对于某些字符集,有相应的字符类:\
\w[a-zA-Z0-9_] \
相同 \d[0-9] \
相同 \s[\t\n\v\f\r ]

几乎相同

分组

我们可以将模式分组以将比赛的一部分作为结果数组中的单独项目:

let string = "First name: John, Last name: Doe"
let reges = /First name: (\w+), Last name: (\w+)/g

管道字符|允许指定表达式可以在不同的表达式中。让我们上一个示例:

let string = "mop hop top cop"
let regex = /(m|t|c)op/g // array of matches: mop,top,cop

标志

有6个标志会影响JavaScript的正则搜索,但只有3个使用最多的标志:

  • i-案例不敏感:Zz之间没有区别
  • g -global:使用此标志,搜索返回所有可能的匹配,没有此标志,只有第一个匹配返回
  • m-多行:它影响^$的行为,在多行模式下,匹配也在行的开头或结尾

实际例子

电话号码

let regex = /\d{3}(-| )\d{3}(-| )\d{3}/
let phoneNumber1 = "123-123-123" // ✅
let phoneNumber2 = "123 123 123" // ✅
let phoneNumber3 = "123123123" // ❌
let phoneNumber4 = "(123) 123 1234" // ❌

URL

let regex = /^(https?):\/\/[^\s].[^\s]*/
let url1 = "https://www.google.com/" // ✅
let url2 = "http://www.twitter.com/" // ✅
let url3 = "https://nikolasbarwicki.com" // ✅
let url4 = "www.google.com/" // ❌
let url5 = "google.com/" // ❌

电子邮件地址

let regex = /([a-zA-Z0-9-_.]+)@([a-zA-Z+]).(.+)/
let email1 = "john_10@gmail.com" // ✅
let email2 = "john-doe-10@stanford.edu.com" // ✅
let email3 = "John.Doe@mop.co.uk" // ✅
let email4 = "johndoegmail.com" // ❌

概括

我真的相信,当需要理解正则表达式时,本文足以满足90%的案例。

非常感谢您的阅读和快乐学习! ð¥s