js 正则表达式提取字符串

js 正则表达式提取字符串

正则表达式是一种强大的文本匹配工具,它可以用来在字符串中查找符合某种模式的子串。在 JavaScript 中,正则表达式可以通过 RegExp 对象实例化来使用。本文将介绍如何使用正则表达式来提取字符串中的子串。

基本语法

正则表达式是由一系列字符和特殊字符构成的字符串,用于匹配目标字符串中符合给定模式的子串。JavaScript 中可以通过两种方式定义正则表达式:

  • 字面量方式:使用斜杠(/)将正则表达式包裹起来,此时可以添加一些修饰符(如 g、i、m 等)来控制匹配行为。
  • 构造函数方式:使用 RegExp 构造函数来创建正则表达式对象,第一个参数为正则表达式字符串,第二个参数为修饰符字符串。

下面是一个使用字面量定义正则表达式的例子:

// 提取字符串中的数字
let str = '3.1415926535';
let reg = /\d+/; // 正则表达式匹配连续的数字
console.log(reg.exec(str)); // ["3"]

输出结果为 [“3”],表示在字符串 str 中找到了符合正则表达式的第一个子串,即数字 3。

常用修饰符

在正则表达式中,修饰符用于控制匹配行为,常用的修饰符包括:

  • g:全局匹配,即查找所有符合模式的子串。
  • i:忽略大小写匹配,即不区分大小写地查找子串。
  • m:多行匹配,即允许匹配目标字符串中的多行文本。

在上面的例子中,如果我们希望提取字符串中所有的数字,可以在正则表达式最后添加修饰符 g:

let str = '3.1415926535';
let reg = /\d+/g; // 全局匹配连续的数字
console.log(reg.exec(str)); // ["3"]
console.log(reg.exec(str)); // ["1415926535"]

输出结果为 [“3”] 和 [“1415926535”],表示在字符串 str 中找到了两个符合正则表达式的子串,分别为数字 3 和数字 1415926535。

捕获组

在正则表达式中,用小括号 ( ) 包裹子表达式表示一个捕获组,在匹配过程中,捕获组的内容会保存在 1、2、$3 等特殊变量中,从左到右依次编号。下面是一个例子:

// 提取字符串中的日期
let str = '今天是2021年7月15日';
let reg = /(\d+)年(\d+)月(\d+)日/; // 捕获组匹配年月日
console.log(reg.exec(str)); // ["2021年7月15日", "2021", "7", "15"]
console.log(RegExp.1); // "2021"
console.log(RegExp.2); // "7"
console.log(RegExp.$3); // "15"

输出结果为 [“2021年7月15日”, “2021”, “7”, “15”],表示在字符串 str 中找到了符合正则表达式的子串和三个捕获组,分别为 2021、7、15。由于使用了捕获组,因此可以通过特殊变量 1、2、$3 来获取捕获组中的内容。

非捕获组

在正则表达式中,用 (?: ) 包裹子表达式表示一个非捕获组,与捕获组不同的是,非捕获组不会生成特殊变量,即不能通过 1、2、$3 等方式获取其内容。非捕获组通常用于提高匹配效率或者排除不需要的内容。下面是一个例子:

// 提取邮箱地址
let str = '我的邮箱地址是example@example.com';
let reg = /(?:\w+\.)*(\w+)@(\w+\.\w+)/; // 非捕获组匹配邮箱地址
console.log(reg.exec(str)); // ["example@example.com", "example", "com"]

输出结果为 [“example@example.com”, “example”, “com”],表示在字符串 str 中找到了符合正则表达式的子串和两个非捕获组,分别为 example 和 com。由于使用了非捕获组,因此不能通过特殊变量来获取其内容。

贪婪匹配与非贪婪匹配

在正则表达式中,默认为贪婪匹配,即匹配尽可能多的字符。如果希望匹配尽可能少的字符,则需要使用非贪婪匹配,即在匹配子表达式后添加问号(?)。下面是一个例子:

// 提取字符串中的引号内容
let str = '这是"引号内的内容"和"另一个引号内的内容"';
let reg = /\"(.*?)\"/g; // 非贪婪匹配引号内的内容
console.log(reg.exec(str)); // ["\"引号内的内容\"", "引号内的内容"]
console.log(reg.exec(str)); // ["\"另一个引号内的内容\"", "另一个引号内的内容"]

输出结果为 [“\”引号内的内容\””, “引号内的内容”] 和 [“\”另一个引号内的内容\””, “另一个引号内的内容”],表示在字符串 str 中找到了两个符合正则表达式的子串,分别为引号内的内容。

使用正则表达式进行替换

除了提取字符串中的子串外,正则表达式还可以用于进行字符串替换。在 JavaScript 中,可以使用 String 类型的 replace 方法来进行替换操作。replace 方法接受两个参数:第一个参数为正则表达式或者字符串,表示要进行替换的模式;第二个参数为替换后的内容。下面是一个例子:

// 将数字转换为汉字
let str = '1234567890';
let map = {
  '0': '零',
  '1': '一',
  '2': '二',
  '3': '三',
  '4': '四',
  '5': '五',
  '6': '六',
  '7': '七',
  '8': '八',
  '9': '九'
};
let reg = /\d/g; // 匹配数字
console.log(str.replace(reg, match => map[match])); // "一二三四五六七八九零"

输出结果为 “一二三四五六七八九零”,表示将字符串 str 中的数字用汉字替换。

结论

正则表达式是一种灵活、强大的文本匹配工具,在 JavaScript 中可以通过 RegExp 对象来实现。常用的正则表达式语法包括基本语法、常用修饰符、捕获组、非捕获组、贪婪匹配与非贪婪匹配等。除了提取字符串中的子串外,正则表达式还可以用于进行字符串替换等操作。学习和掌握正则表达式对于开发高效、精简的程序非常重要。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程