欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

TypeScript中正則表達(dá)式的用法及實(shí)際應(yīng)用

 更新時(shí)間:2025年07月18日 10:55:18   作者:Ophelia(禿頭版  
正則表達(dá)式是處理字符串查找、匹配、替換的非常有效的工具,這篇文章主要介紹了TypeScript中正則表達(dá)式的用法及實(shí)際應(yīng)用,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

正則表達(dá)式是處理字符串的強(qiáng)大工具,在 TypeScript/JavaScript 中同樣適用。本文將帶你全面了解正則表達(dá)式在 TS 中的用法,包括基礎(chǔ)語法、高級技巧和實(shí)際應(yīng)用場景。

一、正則表達(dá)式基礎(chǔ)

1. 創(chuàng)建正則表達(dá)式

1. 字面量語法

基本語法

const regex = /pattern/flags;
  • pattern: 正則表達(dá)式的主體模式
  • flags: 可選的修飾符(如 i, g, m 等)

特點(diǎn)

  1. 在腳本加載時(shí)編譯(當(dāng)正則表達(dá)式是常量時(shí)性能更好)
  2. 更簡潔直觀的語法
  3. 不需要轉(zhuǎn)義反斜杠(\

2. 構(gòu)造函數(shù)語法

基本語法

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

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

特點(diǎn)

  1. 在運(yùn)行時(shí)編譯正則表達(dá)式
  2. 可以使用變量動(dòng)態(tài)構(gòu)建正則表達(dá)式
  3. 字符串中的反斜杠需要轉(zhuǎn)義(\\
  4. 可以基于已有的正則對象創(chuàng)建新的正則

何時(shí)使用哪種方式

  1. 使用字面量語法

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

    • 不需要?jiǎng)討B(tài)構(gòu)建正則

    • 需要更好的可讀性

  2. 使用構(gòu)造函數(shù)語法

    • 需要動(dòng)態(tài)構(gòu)建正則表達(dá)式(如基于用戶輸入)

    動(dòng)態(tài)構(gòu)建

    在程序運(yùn)行時(shí)(而非編寫代碼時(shí))根據(jù)需要?jiǎng)?chuàng)建或修改正則表達(dá)式模式。

    • 正則模式需要從變量或配置中獲取
    • 需要在運(yùn)行時(shí)組合多個(gè)正則片段

2. 常用修飾符(flags)

1.i(ignoreCase) - 不區(qū)分大小寫

作用:使匹配不區(qū)分大小寫

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) - 全局匹配

作用:查找所有匹配項(xiàng),而不是在第一個(gè)匹配后停止

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) - 多行模式

作用:使 ^$ 匹配每行的開頭和結(jié)尾,而不是整個(gè)字符串的開頭和結(jié)尾

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

// 不使用 m 修飾符
console.log(/^Second/.test(multiLineText)); // false
//在整個(gè)字符串的開頭位置嘗試匹配 "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 (正確匹配單個(gè)emoji字符)

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

5.s(dotAll) - dotAll 模式

作用:使 . 匹配包括換行符在內(nèi)的任意字符

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

組合使用多個(gè)修飾符

可以同時(shí)使用多個(gè)修飾符,順序無關(guān)緊要:

// 不區(qū)分大小寫 + 全局匹配 + 多行模式
const regex = /^hello/gim;

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

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

二、正則表達(dá)式語法詳解

1. 字符匹配

模式描述
.匹配除換行符外的任意字符
\d匹配數(shù)字,等價(jià)于 [0-9]
\D匹配非數(shù)字,等價(jià)于 [^0-9]
\w匹配字母、數(shù)字或下劃線
\W匹配非字母、數(shù)字、下劃線
\s匹配空白字符(空格、制表符等)
\S匹配非空白字符

2. 量詞

模式描述
*匹配前一個(gè)表達(dá)式 0 次或多次
+匹配前一個(gè)表達(dá)式 1 次或多次
?匹配前一個(gè)表達(dá)式 0 次或 1 次
{n}匹配前一個(gè)表達(dá)式恰好 n 次
{n,}匹配前一個(gè)表達(dá)式至少 n 次
{n,m}匹配前一個(gè)表達(dá)式 n 到 m 次

3. 位置匹配

模式描述
^匹配輸入的開始。如,^abc 表示字符串必須以 abc 開頭。
$匹配輸入的結(jié)束。如,abc$ 表示字符串必須以 abc 結(jié)尾。
\b匹配單詞邊界
\B匹配非單詞邊界

4.字符類

模式描述
[]定義一個(gè)字符類,匹配方括號內(nèi)的任意一個(gè)字符。例如,[abc] 可以匹配 a、bc
[^]表示取反,匹配不在方括號內(nèi)的任意一個(gè)字符。例如,[^abc] 可以匹配除 a、b、c 之外的任意字符。
[a-z]、[A-Z]、[0-9]表示范圍,分別匹配小寫字母、大寫字母和數(shù)字。

三、TypeScript 中的正則方法

1. RegExp 方法

const regex = /hello/;

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

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

2. String 方法

const str = 'Hello world, hello TypeScript';

// match() - 返回匹配結(jié)果
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"]

四、實(shí)際應(yīng)用示例

1. 驗(yàn)證郵箱格式

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

1.^- 匹配字符串開始

確保匹配從字符串開頭開始,防止前面有其他字符

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

  • [^\s@]:字符類,匹配任何不是空白字符(\s)也不是@符號的字符
  • +:匹配前面的元素一次或多次
  • 效果:匹配一個(gè)或多個(gè)非空白、非@的字符

3.@- 匹配@符號

郵箱地址必須包含一個(gè)@符號

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

  • 同上,匹配@和點(diǎn)號之間的部分
  • 例如在user@example.com中匹配example

5.\.- 匹配點(diǎn)號

  • 轉(zhuǎn)義的點(diǎn)號,匹配實(shí)際的.字符
  • 域名必須包含一個(gè)點(diǎn)號

正則表達(dá)式中的點(diǎn)號.

  • 在正則中,未轉(zhuǎn)義的點(diǎn)號 . 是一個(gè)特殊字符
  • 它表示匹配除換行符外的任意單個(gè)字符
  • 例如 a.c 可以匹配 “abc”、“a c”、“a$c” 等

轉(zhuǎn)義點(diǎn)號\.

  • 當(dāng)我們需要匹配實(shí)際的點(diǎn)號字符時(shí),必須轉(zhuǎn)義它
  • 使用反斜杠 \ 進(jìn)行轉(zhuǎn)義:\.
  • 這樣 \. 就表示字面的點(diǎn)號字符 “.” 而不是通配符

6.[^\s@]+- 頂級域名(TLD)

  • 匹配點(diǎn)號后的部分
  • 例如在example.com中匹配com

7.$- 匹配字符串結(jié)束

確保匹配直到字符串結(jié)束,防止后面有其他字符

完整匹配流程

以郵箱 username@example.com 為例:

  1. ^ 從字符串開始
  2. [^\s@]+ 匹配 username
  3. @ 匹配 @
  4. [^\s@]+ 匹配 example
  5. \. 匹配 .
  6. [^\s@]+ 匹配 com
  7. $ 確保字符串結(jié)束

2. 提取URL中的參數(shù)

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;
}

正則表達(dá)式解析

核心的正則表達(dá)式是 /[?&]([^=#]+)=([^&#]*)/g,讓我們分解它的每個(gè)部分:

1.[?&]

  • 匹配 ?& 字符
  • ? 開始查詢參數(shù)部分
  • & 分隔多個(gè)參數(shù)

2.([^=#]+)

  • 第一個(gè)捕獲組 (),匹配參數(shù)名
  • [^=#] 匹配任何不是 =# 的字符
  • + 表示匹配一個(gè)或多個(gè)這樣的字符

3.=

  • 匹配字面的等號,分隔參數(shù)名和值

4.([^&#]*)

  • 第二個(gè)捕獲組 (),匹配參數(shù)值
  • [^&#] 匹配任何不是 &# 的字符
  • * 表示匹配零個(gè)或多個(gè)這樣的字符(允許空值)

5./g

  • 全局標(biāo)志,匹配所有符合條件的結(jié)果

匹配過程示例

對于 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. 遇到 # 停止匹配

執(zhí)行流程

  1. 初始化空對象 params 存儲結(jié)果
  2. 使用 while 循環(huán)和 regex.exec() 遍歷所有匹配
  3. 每次匹配:
    • match[1] 是參數(shù)名
    • match[2] 是參數(shù)值
    • 將鍵值對存入 params 對象
  4. 返回最終的 params 對象

3. 密碼強(qiáng)度驗(yàn)證

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

1. 檢查純字母或純數(shù)字

/^[a-zA-Z]+$/  // 純字母
/^\d+$/        // 純數(shù)字
  • ^$ 確保整個(gè)字符串匹配
  • [a-zA-Z] 匹配任何大小寫字母
  • \d 匹配數(shù)字
  • + 表示一個(gè)或多個(gè)

2. 檢查同時(shí)包含字母和數(shù)字

/^(?=.*[a-zA-Z])(?=.*\d).+$/
  • (?=.*[a-zA-Z]) 正向先行斷言,確保字符串包含字母
  • (?=.*\d) 正向先行斷言,確保字符串包含數(shù)字

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

基本語法

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

  • 當(dāng)前位置后面必須能匹配 pattern
  • 但匹配后,正則引擎的當(dāng)前位置不會改變

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

這個(gè)表達(dá)式由兩個(gè)正向先行斷言組成,分別檢查密碼中是否包含字母和數(shù)字。

第一個(gè)斷言 (?=.*[a-zA-Z])

  1. .*
  • . 匹配任意字符(除換行符)
  • * 表示零次或多次
  • .* 組合表示"任意數(shù)量的任意字符"
  1. [a-zA-Z]
  • 匹配任意大小寫字母
  1. 整體含義:
  • 在字符串的任意位置(因?yàn)?.*)后面必須有一個(gè)字母
  • 相當(dāng)于"字符串中必須包含至少一個(gè)字母"

第二個(gè)斷言 (?=.*\d)

  1. \d
  • 匹配任意數(shù)字(等價(jià)于 [0-9]
  1. 整體含義:
  • 在字符串的任意位置后面必須有一個(gè)數(shù)字
  • 相當(dāng)于"字符串中必須包含至少一個(gè)數(shù)字"

組合效果

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

  1. ^ 從字符串開頭開始
  2. (?=.*[a-zA-Z]) 斷言:后面某處必須有一個(gè)字母
  3. (?=.*\d) 斷言:后面某處必須有一個(gè)數(shù)字
  4. .+ 實(shí)際匹配:一個(gè)或多個(gè)任意字符
  5. $ 直到字符串結(jié)束
  • .+ 匹配整個(gè)字符串(至少一個(gè)字符)

3. 檢查包含特殊字符

/^(?=.*[a-zA-Z])(?=.*\d)(?=.*[^a-zA-Z\d]).+$/
  • (?=.*[^a-zA-Z\d]) 正向先行斷言,確保字符串包含非字母非數(shù)字的字符(即特殊字符)
  • [^a-zA-Z\d] 匹配任何不是字母也不是數(shù)字的字符

總結(jié) 

到此這篇關(guān)于TypeScript中正則表達(dá)式的用法及實(shí)際應(yīng)用的文章就介紹到這了,更多相關(guān)TS中正則表達(dá)式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 2014 年最熱門的21款JavaScript框架推薦

    2014 年最熱門的21款JavaScript框架推薦

    這篇文章主要介紹了2014 年最熱門的JavaScript框架推薦,需要的朋友可以參考下
    2014-12-12
  • 微信小程序?qū)崿F(xiàn)動(dòng)態(tài)驗(yàn)證碼

    微信小程序?qū)崿F(xiàn)動(dòng)態(tài)驗(yàn)證碼

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)動(dòng)態(tài)驗(yàn)證碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • JS處理json日期格式化問題

    JS處理json日期格式化問題

    這篇文章主要介紹了JS處理json日期格式化問題的相關(guān)資料,需要的朋友可以參考下
    2015-10-10
  • JS表單數(shù)據(jù)驗(yàn)證的正則表達(dá)式(常用)

    JS表單數(shù)據(jù)驗(yàn)證的正則表達(dá)式(常用)

    這篇文章主要介紹了JS表單數(shù)據(jù)驗(yàn)證的正則表達(dá)式,這種方法比較常用,以及使用正則表達(dá)式驗(yàn)證表單的方法,本文給大家介紹非常詳細(xì),需要的的朋友參考下
    2017-02-02
  • js中利用cookie實(shí)現(xiàn)記住密碼功能

    js中利用cookie實(shí)現(xiàn)記住密碼功能

    這篇文章主要為大家詳細(xì)介紹了js中利用cookie實(shí)現(xiàn)記住密碼功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • JavaScript中Async/Await通過同步的方式實(shí)現(xiàn)異步的方法介紹

    JavaScript中Async/Await通過同步的方式實(shí)現(xiàn)異步的方法介紹

    在JavaScript的異步編程中,我們經(jīng)常使用回調(diào)函數(shù)、Promise和 Async/Await來解決異步操作的問題,Async/Await 又是Promise的語法糖,它的出現(xiàn)讓異步編程變得更加直觀和易于理解,本文將詳細(xì)講解Async/Await如何通過同步的方式實(shí)現(xiàn)異步
    2023-06-06
  • JavaScript實(shí)現(xiàn)清空(重置)文件類型INPUT元素值的方法

    JavaScript實(shí)現(xiàn)清空(重置)文件類型INPUT元素值的方法

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)清空(重置)文件類型INPUT元素值的方法,結(jié)合實(shí)例形式分析了javascript清空input文本框的常用方法與實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-11-11
  • Bootstrap Modal遮罩彈出層代碼分享

    Bootstrap Modal遮罩彈出層代碼分享

    本文給大家分享的這段代碼并非是Bootstrap的遮罩,只是簡單版的遮罩效果,對bootstrap modal 遮罩效果感興趣的朋友可以參考下本文
    2016-11-11
  • 一個(gè)關(guān)于JS操作符in問題引發(fā)的探究

    一個(gè)關(guān)于JS操作符in問題引發(fā)的探究

    這篇文章主要給大家介紹了一個(gè)JS操作符in問題引發(fā)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 前端中骨架屏的三種運(yùn)用方式介紹

    前端中骨架屏的三種運(yùn)用方式介紹

    這篇文章主要為大家詳細(xì)介紹了前端中骨架屏的三種運(yùn)用方式,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-05-05

最新評論