javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > TS中正则表达式

TypeScript中正则表达式的用法及实际应用

作者:Ophelia(秃头版

正则表达式是处理字符串查找、匹配、替换的非常有效的工具,这篇文章主要介绍了TypeScript中正则表达式的用法及实际应用,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

正则表达式是处理字符串的强大工具,在 TypeScript/JavaScript 中同样适用。本文将带你全面了解正则表达式在 TS 中的用法,包括基础语法、高级技巧和实际应用场景。

一、正则表达式基础

1. 创建正则表达式

1. 字面量语法

基本语法

const regex = /pattern/flags;

特点

  1. 在脚本加载时编译(当正则表达式是常量时性能更好)
  2. 更简洁直观的语法
  3. 不需要转义反斜杠(\

2. 构造函数语法

基本语法

const regex = new RegExp('pattern', 'flags');

const regex = new RegExp(/pattern/, 'flags');

特点

  1. 在运行时编译正则表达式
  2. 可以使用变量动态构建正则表达式
  3. 字符串中的反斜杠需要转义(\\
  4. 可以基于已有的正则对象创建新的正则

何时使用哪种方式

  1. 使用字面量语法

    • 正则模式是固定的、已知的

    • 不需要动态构建正则

    • 需要更好的可读性

  2. 使用构造函数语法

    • 需要动态构建正则表达式(如基于用户输入)

    动态构建

    在程序运行时(而非编写代码时)根据需要创建或修改正则表达式模式。

    • 正则模式需要从变量或配置中获取
    • 需要在运行时组合多个正则片段

2. 常用修饰符(flags)

1.i(ignoreCase) - 不区分大小写

作用:使匹配不区分大小写

const regex = /hello/i;

console.log(regex.test('Hello')); // true
console.log(regex.test('HELLO')); // true
console.log(regex.test('hello')); // true
console.log(regex.test('hElLo')); // true

2.g(global) - 全局匹配

作用:查找所有匹配项,而不是在第一个匹配后停止

const str = 'apple, orange, apple, banana';
const regex = /apple/g;

let match;
while ((match = regex.exec(str)) !== null) {
  console.log(`Found '${match[0]}' at index ${match.index}`);
}
// 输出:
// Found 'apple' at index 0
// Found 'apple' at index 15

3.m(multiline) - 多行模式

作用:使 ^$ 匹配每行的开头和结尾,而不是整个字符串的开头和结尾

const multiLineText = `First line
Second line
Third line`;

// 不使用 m 修饰符
console.log(/^Second/.test(multiLineText)); // false
//在整个字符串的开头位置尝试匹配 "Second"

// 使用 m 修饰符
console.log(/^Second/m.test(multiLineText)); // true

4.u(unicode) - Unicode 模式

作用:正确处理大于 \uFFFF 的 Unicode 字符

const emojiText = '😊 笑脸';

// 不使用 u 修饰符
console.log(/^.$/.test(emojiText)); // false (无法正确匹配emoji)

// 使用 u 修饰符
console.log(/^.$/u.test(emojiText)); // true (正确匹配单个emoji字符)

// 匹配特定Unicode字符
console.log(/\p{Emoji}/u.test('😊')); // true
console.log(/\p{Script=Han}/u.test('汉')); // true (匹配汉字)

5.s(dotAll) - dotAll 模式

作用:使 . 匹配包括换行符在内的任意字符

const textWithNewline = 'Hello\nWorld';

// 不使用 s 修饰符
console.log(/Hello.World/.test(textWithNewline)); // false (.不匹配换行符)

// 使用 s 修饰符
console.log(/Hello.World/s.test(textWithNewline)); // true

// 替代方案(不使用s修饰符)
console.log(/Hello[\s\S]World/.test(textWithNewline)); // true

组合使用多个修饰符

可以同时使用多个修饰符,顺序无关紧要:

// 不区分大小写 + 全局匹配 + 多行模式
const regex = /^hello/gim;

const text = `Hello world
hello everyone
HELLO there`;

console.log(text.match(regex)); 
// ["Hello", "hello", "HELLO"]

二、正则表达式语法详解

1. 字符匹配

模式描述
.匹配除换行符外的任意字符
\d匹配数字,等价于 [0-9]
\D匹配非数字,等价于 [^0-9]
\w匹配字母、数字或下划线
\W匹配非字母、数字、下划线
\s匹配空白字符(空格、制表符等)
\S匹配非空白字符

2. 量词

模式描述
*匹配前一个表达式 0 次或多次
+匹配前一个表达式 1 次或多次
?匹配前一个表达式 0 次或 1 次
{n}匹配前一个表达式恰好 n 次
{n,}匹配前一个表达式至少 n 次
{n,m}匹配前一个表达式 n 到 m 次

3. 位置匹配

模式描述
^匹配输入的开始。如,^abc 表示字符串必须以 abc 开头。
$匹配输入的结束。如,abc$ 表示字符串必须以 abc 结尾。
\b匹配单词边界
\B匹配非单词边界

4.字符类

模式描述
[]定义一个字符类,匹配方括号内的任意一个字符。例如,[abc] 可以匹配 abc
[^]表示取反,匹配不在方括号内的任意一个字符。例如,[^abc] 可以匹配除 abc 之外的任意字符。
[a-z][A-Z][0-9]表示范围,分别匹配小写字母、大写字母和数字。

三、TypeScript 中的正则方法

1. RegExp 方法

const regex = /hello/;

// test() - 测试是否匹配
regex.test('hello world'); // true

// exec() - 执行搜索,返回匹配结果或 null
const result = regex.exec('hello world');
console.log(result?.[0]); // "hello"

2. String 方法

const str = 'Hello world, hello TypeScript';

// match() - 返回匹配结果
str.match(/hello/gi); // ["Hello", "hello"]

// search() - 返回匹配位置的索引
str.search(/world/); // 6

// replace() - 替换匹配的子串
str.replace(/hello/gi, 'Hi'); // "Hi world, Hi TypeScript"

// split() - 使用正则分割字符串
'one,two,three'.split(/,/); // ["one", "two", "three"]

四、实际应用示例

1. 验证邮箱格式

function isValidEmail(email: string): boolean {
  const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  return emailRegex.test(email);
}

1.^- 匹配字符串开始

确保匹配从字符串开头开始,防止前面有其他字符

2.[^\s@]+- 本地部分(local-part)

3.@- 匹配@符号

邮箱地址必须包含一个@符号

4.[^\s@]+- 域名第一部分

5.\.- 匹配点号

正则表达式中的点号.

转义点号\.

6.[^\s@]+- 顶级域名(TLD)

7.$- 匹配字符串结束

确保匹配直到字符串结束,防止后面有其他字符

完整匹配流程

以邮箱 username@example.com 为例:

  1. ^ 从字符串开始
  2. [^\s@]+ 匹配 username
  3. @ 匹配 @
  4. [^\s@]+ 匹配 example
  5. \. 匹配 .
  6. [^\s@]+ 匹配 com
  7. $ 确保字符串结束

2. 提取URL中的参数

function getUrlParams(url: string): Record<string, string> {
  const params: Record<string, string> = {};
  const paramRegex = /[?&]([^=#]+)=([^&#]*)/g;
  
  let match;
  while ((match = paramRegex.exec(url)) !== null) {
    params[match[1]] = match[2];
  }
  
  return params;
}

正则表达式解析

核心的正则表达式是 /[?&]([^=#]+)=([^&#]*)/g,让我们分解它的每个部分:

1.[?&]

2.([^=#]+)

3.=

4.([^&#]*)

5./g

匹配过程示例

对于 URL http://example.com?name=John&age=25#section1

  1. 第一次匹配:
    • 匹配 ?name=John
    • match[1] = “name”
    • match[2] = “John”
  2. 第二次匹配:
    • 匹配 &age=25
    • match[1] = “age”
    • match[2] = “25”
  3. 遇到 # 停止匹配

执行流程

  1. 初始化空对象 params 存储结果
  2. 使用 while 循环和 regex.exec() 遍历所有匹配
  3. 每次匹配:
    • match[1] 是参数名
    • match[2] 是参数值
    • 将键值对存入 params 对象
  4. 返回最终的 params 对象

3. 密码强度验证

function checkPasswordStrength(password: string): 'weak' | 'medium' | 'strong' {
  // 至少8个字符
  if (password.length < 8) return 'weak';
  
  // 弱: 只有字母或数字
  if (/^[a-zA-Z]+$/.test(password) || /^\d+$/.test(password)) {
    return 'weak';
  }
  
  // 中: 包含字母和数字
  if (/^(?=.*[a-zA-Z])(?=.*\d).+$/.test(password)) {
    // 强: 包含字母、数字和特殊字符
    if (/^(?=.*[a-zA-Z])(?=.*\d)(?=.*[^a-zA-Z\d]).+$/.test(password)) {
      return 'strong';
    }
    return 'medium';
  }
  
  return 'weak';
}

1. 检查纯字母或纯数字

/^[a-zA-Z]+$/  // 纯字母
/^\d+$/        // 纯数字

2. 检查同时包含字母和数字

/^(?=.*[a-zA-Z])(?=.*\d).+$/

正向先行断言(?=.*)

基本语法

(?=pattern) 是正向先行断言的基本形式,表示:

(?=.*[a-zA-Z])(?=.*\d)解析

这个表达式由两个正向先行断言组成,分别检查密码中是否包含字母和数字。

第一个断言 (?=.*[a-zA-Z])

  1. .*
  1. [a-zA-Z]
  1. 整体含义:

第二个断言 (?=.*\d)

  1. \d
  1. 整体含义:

组合效果

/^(?=.*[a-zA-Z])(?=.*\d).+$/ 表示:

  1. ^ 从字符串开头开始
  2. (?=.*[a-zA-Z]) 断言:后面某处必须有一个字母
  3. (?=.*\d) 断言:后面某处必须有一个数字
  4. .+ 实际匹配:一个或多个任意字符
  5. $ 直到字符串结束

3. 检查包含特殊字符

/^(?=.*[a-zA-Z])(?=.*\d)(?=.*[^a-zA-Z\d]).+$/

总结 

到此这篇关于TypeScript中正则表达式的用法及实际应用的文章就介绍到这了,更多相关TS中正则表达式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文