[译]掌握正则表达式

89 阅读7分钟

原文链接:dev.to/kalashin1/m… 作者:Kinanee Samson

这是一系列文章的第二部分,在第一篇文章中,我们研究了JavaScript中的字符串,我们看到了如何操作和处理字符串,我们看到了index Of和切片方法,字符串的长度属性以及它们如何使处理字符串变得更容易,如果你错过了那篇文章,请检查这里

在本文中,我们将研究正则表达式。

正则表达式

正则表达式是帮助我们根据字符搜索字符串的模式,它们不仅仅局限于JavaScript,你会在pHp、MySQL、C、C++等中找到它们。正则表达式非常有用,它们让处理字符串像早上在床上吃饭一样快乐。你会惊讶于条件语句是如何被一行正则表达式所取代的。正则表达式对于数据验证也很有用,您不能信任用户输入程序所需的正确数据,因此您可以使用正则表达式来确保用户输入的数据符合所需的模式。让我们看看正则表达式的语法。

let myRegExp = /a/ //creates a regular expression that will search of match a in a string, or

let myRegExp = new RegExp('/a/') //This is also fine to work with too

我们可以使用RegExp构造函数来创建一个正则表达式,或者我们可以创建一个没有构造函数的正则表达式,不管你想要什么样的构造函数都是完全可以接受的。您想要匹配或搜索的模式应该包含在两个正斜杠中,您可以将其分配给一个变量,就像我们上面所做的那样,或者您调用RegExp构造函数并传递两个正斜杠,其中包含您想要在双引号中匹配的模式。让我们看一个典型的用例,假设我们想在字符串中搜索字母a,我们可以这样做。

let myString = 'bat',

let myRegExp = /a/

console.log(myRegExp.test(myString))

//logs out true

我们得到真正的注销是因为'bat'包含一个。我们提供给测试函数的字符串与使用测试方法的RegExp模式匹配。我们也可以测试一个字符串的多个模式,比如说我们想找到一个模式,它有a,e,i,o,u,我们可以这样做...

let searchPattern = /[aeiou]/ //the patterns we want to

//test, remember we are testing for a, e, i, o, u.

let myString = 'bet'

console.log(searchPattern.test(myString))

//logs out true

myString ='bar'

console.log(searchPattern.test(myString))

//logs out true

myString = 'but'

console.log(searchPattern.test(myString))

//logs out true

对于我们分配给my String变量的所有值,它都返回true,因为搜索模式说我们应该测试包含在方括号内的任何字母的字符串。要注意的是,不管字符串中模式的位置如何,我们的模式总是会返回true,但是我们可以更好地控制匹配模式的字符应该在哪里,我们可以测试我们想要匹配的字符应该在字符串的开头还是结尾。为了测试字符是否在字符串的开头,我们可以这样做...

let searchPattern = /^a/

let myString = 'bat'

console.log(seacrhPattern.test(myString))

//logs false because a is not at the starting

//of the string

myString = 'act'

console.log(searchPattern.test(myString))

//logs true

当我们希望搜索的模式出现在字符串的开头时,我们在正则表达式中使用 (^) ,如果我们提供的字符串不在开头,我们会得到false。如果我们想测试字符串末尾的字符,我们可以这样做。

let searchPattern = /r$/

let myString = 'Brat'

console.log(searchPattern.test(myString))

//logs out false because r is not at the end of the string

myString = 'bar'

console.log(searchPattern.test(myString))

//logs out true coz r is at the end of the string

我们可以将两者结合在一起,以确保我们正在测试一个单词,比如 ....

let searchPattern = /^tar$/

let myString = 'Star'

console.log(searchPattern.test(myString))

//logs out false because star begins with s

myString = 'tar'

console.log(searchPattern.test(myString))

//logs out true because the string contains only the words tar

我们还可以使用管道运算符来允许多个模式,如果字符串匹配任何模式,则返回true,就像我们在前面的示例中所做的那样,我们使用括号和管道运算符将我们想要的多个模式连接到字符串中,例如;

let searchPattern = /(^a|e|i|o|u)/

let myString = 'card'

console.log(searchPattern.test(myString))

//logs out false because we excluded a from the pattern and thus card doesnt fit 

myString = 'cool'

console.log(searchPattern.test(myString))

//logs put true because o is among the list of pattern we want to match

我们可以添加额外的修饰符来使我们的模式更加灵活,比如我们正在搜索模式,而不管具体情况如何,或者我们想要返回多个匹配项,或者我们想要执行多行搜索;默认情况下,正则表达式只针对单个字符串搜索模式,除非我们告诉它超越这一点。有三个修饰符允许我们这样做,i,g和m,让我们看看如何在正则表达式中使用它。

let searchPattern = /a/i //now this will match for a irrespective of the case

let myString = 'And'

console.log(searchPattern.test(myString))

//logs true because we are searching irrespective of the case.

我们还可以全局搜索并返回字符串的所有匹配项。

let searchPattern = /cat/g //this will match the pattern cat in a string for each occurence of that pattern in the string.

let pattern = new RegExp('cat', 'g') //this is how we can do this using the RegExp constructor

如果我们有一个多行字符串,我们想在它里面搜索一个模式,我们可以这样做;

let searchPattern = /cat/m //this will match the pattern cat in a multi line string

let patter = new RegExp('cat', 'm') // The constructor method

让我们深入到RegExp的实际使用中,我们可以测试一个字符串来检查它是否只包含小写字母、大写字母或单词,我们也可以测试一个字符串是否包含特殊字符。让我们检查一个字符串,看看它是否与只有小写字母的模式相匹配。

let searchPattern = /^[a-z]+$/ //this is the format for checking only lower case letters

let myString = 'Kalashin'

console.log(searchPattern.test(myString))

//logs out false becuase the string begins with an uppercase K

myString = 'kalashin'

console.log(searchPattern.test(myString))

//logs out true because we have no uppercase in the string

您可能想知道为什么我们在模式中添加了一个加号,我们将很快讨论这个问题,如果我们检查上面的例子,我们只是说字符串必须以小写字母开始,以小写字母结束,这就是为什么我们有(^和$)记住?我们只是添加+符号来说明字符串中小写字母的出现次数不止一次。我们将很快讨论更多。让我们匹配一个大写字母和一个数字。

let searchPattern = /[A-Z]?[0-9]+/ //we are matching against uppercase alphabets and numbers

let myString = 'kalashin'

console.log(searchPattern.test(myString)) //logs out false

myString = 'KaLAshin098'

console.log(searchPattern.test(myString))

//logs out true

我们可以使用量词来限制我们在特定字符串中试图匹配的字符数量。这是一个包含大量字符的表;

NotationPossible Number of times character appears*0 or 1 time+1 or more time?0 or more times{n}n number of times where n is an integer{n,m}n to m number of times where n and m are integers

我们现在有足够的知识来制作我们的验证器,让我们试着制作一个密码验证器,我们的密码验证器将检查大写、小写和数字的存在。

let isPassword = (val) => {

    if(val.length < 8){

        throw Error('Passowrd should be at least 8 characters long')

    }

    let pattern = /[a-z]?[A-Z]+[a-z]+[0-9]+/

    return pattern.test(val)

}



console.log(isPassword('Kinder092'))

//logs out true

console.log(isPassword('lanertes'))

//logs out false

我们用来匹配值的模式指定小写字母可以在大写字母之前出现一次或多次,大写字母必须出现一次或多次,小写字母也必须出现一次或多次,然后是一个或多个数字,如果我们提供的字符串与模式不匹配,显然我们会得到false,因为它不包含小写字母、大写字母和数字,您可以使用它进行验证。让我们在此基础上构建并编写一个验证器来检查电子邮件。

let isEmail = (val) => {

    let pattern = /^[\w]+(\.[\w]+)*@([\w]+\.)+[a-z]{2,7}$/

    return pattern.test(val)

}



let email = 'kinanee@gmail.com'

console.log(isEmail(email))

//logs out true

email = 'playwe.careers@game.com'

console.log(isEmail(email))

//logs out true

让我们检查我们的模式,我们检查字符串是否存在一个或多个字母,接下来我们检查是否存在一个句号,但我们必须逃避它,因为在RegExp句号中,句号用于表示通配符搜索(任何字符),然后我们检查是否存在一个或多个字母,该字母紧跟星号,该@字符紧跟一个或多个字母,该字母紧跟一个句号,该句号紧跟至少2个字母。这确保了我们的测试可以容纳广泛的电子邮件,因此电子邮件如kala.kalashin.k@yahoo.com或kim@kimk.tk

我们也可以使用RegExp来拆分字符串,我们将一个RegExp作为分隔符传递给拆分函数,它将根据该分隔符拆分字符串。字符串方法搜索和匹配接受RegExp作为参数,首先让我们看看如何使用RegExp作为分隔符拆分字符串

let myString = 'kala, samson, John.vodka'

let splitString = myString.split([,\.])

console.log(splitString)

//logs out [ 'kala', ' samson', ' John', 'vodka' ]

搜索方法返回与我们传递给它的模式相匹配的第一个子串的索引作为搜索模式,所以如果有两个或更多的单词与该模式相匹配,则只返回从左边开始的第一个匹配的索引。

let myString = 'kala, samson, John.vodka'

console.log(myString.search(/samson/i))

//logs out 6 because the substring samson starts from the 6th position

console.log(myString.search(/kala/i))

//logs out 9 because the substring kala begins at index 0

匹配函数也将接受一个正则表达式作为然而,而不是返回子串的索引,它将返回一个数组,其中包含模式、第一个匹配的索引、我们给它的输入字符串以及最后一个组属性。

let heroes = 'deadpool, thor, hulk, ironman, antman, spiderman'

let splitString = heroes.match(/iron/i)

console.log(splitString)

//[

// 'iron',

// index: 22,

//  input: 'deadpool, thor, hulk, ironman, antman, spiderman',

//  groups: undefined

//]

正则表达式也有一个exec方法,它将返回一个类似于匹配方法返回值的数组。这就是我们的正则表达式和字符串文章的全部内容,如果有我遗漏的任何方法,请随意添加到评论部分,很快再见。