什么是正则表达式?
这是一个字符序列,用于匹配字符串中的字符组合,进行文本匹配/搜索。javascript中的正则表达式是由字符序列组成的搜索模式(JavaScript对象)。正则表达式使搜索和匹配字符串变得更加容易和快速。
如何在JavaScript中创建正则对象?
JavaScript中的正则表达式是用RegExp对象创建的。
字面符号法
字面符号是在 JavaScript 中创建 RegExp 对象的一种方法。这种方法涉及到使用正则表达式的字面语法。正则字面符号包括用斜线包围你的表达式,/ ,不使用引号。
下面的代码显示了创建JavaScript正则表达式时使用字面符号的语法。
let re = "Hello Studytonight";
let result1 = /hello/.test(re);
console.log(result1); // false
let result2 = /hello/i.test(re);
console.log(result2); // true
上面的命令所做的,是在字符串Hello Studytonight 中搜索hello 。此外,我们还可以用i这个标志进行不区分大小写的搜索,这样就可以忽略大小写的敏感性。
构造函数
开发人员在JavaScript中创建正则表达式的另一种方法是使用构造函数。这种方法将正则表达式作为字符串纳入函数参数中。下面是一个用构造函数创建JS正则表达式的语法例子。
let str = "Hello Studytonight";
let regex1 = new RegExp('hello');
console.log(regex1.test(str)); // false
let regex2 = new RegExp('hello', 'i');
console.log(regex2.test(str)); // true
正则表达式方法
JavaScript有不同的方法来处理正则表达式。我们将在下面详细讨论这个问题。
1.exec()
方法exec()执行一个搜索,并返回一个结果数组或一个空。它可以用于对一串文本中的多个匹配项进行迭代。例如,我们看一下下面的例子,有无利用exec() 方法进行迭代。
//without iteration
let regex1 = RegExp('fam*', 'g');
let str1 = 'make family everything familiar';
str1 = regex1.exec(str1);
console.log(str1); //output fam, index:5
//with iteration
const regex1 = RegExp('fam*', 'g');
const str1 = 'make family everything familiar';
let array1;
while ((array1 = regex1.exec(str1)) !== null) {
console.log(`Found ${array1[0]}. Next starts at ${regex1.lastIndex}.`);
// outputs "Found fam. Next starts at 8."
// outputs "Found fam. Next starts at 26."
}
注意,在没有迭代的情况下,我们只得到第一个匹配的索引。在迭代的情况下,我们得到的是所有(多个)匹配的结果。
2.没有全局搜索的test()
这个正则方法搜索正则表达式和字符串之间的匹配。如果找到了匹配,它返回真或假。通过这个方法,你也可以使用全局标志 *g*.让我们看一个例子,在一个字符串中搜索一个正则表达式,有和没有全局标记 *g*.
const str = 'in a space of time spark';
const regex = new RegExp('spa');
console.log(regex.test(str));
//output: true
带有全局搜索的test()
使用test()方法,你也可以使用全局标志'.*g*'.下面是一个例子。
const str = 'in a space of time spark';
const globalRegex = new RegExp('spa', 'g');
console.log(globalRegex.test(str));
// output: true
然而,全局标志可以让我们在搜索中进行迭代,以确定spa 在字符串中出现了多少次。我们还可以确定spa 在我们的String中的不同位置的索引。如果没有全局标志,这就无法实现,因为test() 方法将贯穿整个字符串,确定我们的表达式(spa)是否存在,而不考虑它是否出现一次或多次。下面的代码,更好地解释了这一点。
const str = 'in a space of time spark';
const regex = new RegExp('spa');
const globalRegex = new RegExp('spa', 'g');
console.log(regex.test(str));
//output: true
console.log(regex.lastIndex);
// doesn’t matter what position. spa is present so it outputs 0
console.log(regex.test(str));
//output: true
console.log(regex.lastIndex);
// doesn’t matter what position. spa is present so it outputs 0
console.log(regex.test(str));
//output: true
console.log(regex.lastIndex);
// doesn’t matter what position. spa is present so it outputs 0
console.log(globalRegex.test(str));
// output: true
console.log(globalRegex.lastIndex);
// output: 8
console.log(globalRegex.test(str));
// output: true
console.log(globalRegex.lastIndex);
// output: 22
console.log(globalRegex.test(str));
// output: false
console.log(globalRegex.lastIndex);
// output: 0 (because spa only occurs in position 8 and 22)
3.match()
这个方法检索正则表达式与一个字符串的匹配结果。这个方法不是返回真或假,而是输出一个与我们的正则表达式匹配的结果数组。让我们看一个例子,它将匹配我们字符串中的大写字母。全局标志将被用来确保在我们的匹配中对字母表的每一个字母都进行迭代。
const paragraph = 'TheGirl Fakesa Smile.';
const regex = /F(a)[a-z]/g;
const found = paragraph.match(regex);
console.log(found); // Should return ["Fak"]
match() 方法的语法是match(regexp) 。其中regexp是我们的正则表达式对象。如果你不输入参数或直接使用match() 方法,你会得到一个空字符串数组。如果你不在这个方法中使用全局标志,你将得到与exec() 方法相同的结果。
4.matchAll()
matchAll() ,该方法必须使用全局标志来调用。这个方法和match() 方法的区别在于能够返回一个包含所有匹配组和捕获组的迭代器。
5.replace()
如果你不仅想搜索和匹配,而且想替换字符串,replace() 方法将完成这项工作。提供的模式可以是一个字符串或一个正则表达式。
const p = 'The girl is a beautiful girl';
console.log(p.replace('girl', 'lady'));
//output: "The lady is a beautiful girl"
const regex = /girl/i;
console.log(p.replace(regex, 'woman'));
// output: "The woman is a beautiful girl"
6.replaceAll()
如果你想用你的正则表达式模式改变文本中所有出现的字符串,替换所有是很有用的。在replace() 方法中,只有文本中的第一个字符串被替换成我们的模式。然而,replaceAll() 将用我们的模式替换所有出现的字符串,而不仅仅是第一个。
const p = 'The girl is a beautiful girl';
console.log(p.replaceAll('girl', 'lady'));
//output: "The lady is a beautiful lady"
const regex = /girl/g;
console.log(p.replaceAll(regex, 'woman')); //output: "The woman is a beautiful woman"
7.搜索()
搜索方法search() ,用于在正则表达式和一个字符串之间进行搜索匹配。这个方法不输出真或假,也不输出结果的数组。相反,它输出一个数字,显示第一个匹配的索引。例如,下面的例子输出4,这是第一个大写字母 "S "的索引。
let str = "the Soup Is Sour"
let re = /[A-Z]/g
console.log(str.search(re)) //This should output 4
8.split()
我们可以用split方法从我们的字符串中提取子串。这个方法所做的是根据我们的模式将字符串分割成子字符串。然后,它将返回一个包含所有子串的数组。我们可以用分割方法将字符串分割成单词、字符等。
split() 该方法的语法如下所示。
split()
split(separator)
split(separator, limit)
我们发表的每篇博客,目的都是为了分享知识,让大家成为自信的、更好的编码者。