鴻蒙開發:了解正則表達式

前言

從給出的文本中,按照既定的相關規則,匹配出符合的數據,其中的規則就是正則表達式,使用正則表達式,可以使得我們用簡潔的代碼就能實現一定復雜的邏輯,比如判斷一個郵箱賬號是否符合正常的郵箱賬號,再比如判斷一個手機號是否正常的手機號,等等,正因為有了正則,得以讓文本處理起來更加的簡單。

當然,也并不是所有的場景我們都需要去使用正則,比如判斷兩個字符串是否相等,我們使用正則可以判斷如下:

 private isEqual(a: string, b: string): boolean {const regExp = new RegExp(a)return regExp.test(b)}

直接傳遞兩個相比較的字符串即可。

 const isEqual = this.isEqual("AbnerMing", "AbnerMing")console.log("===是否相等:" + isEqual)

顯然以上的判斷是比較冗余的,畢竟我們可以直接判斷。

 const string1: string = "AbnerMing"const string2: string = "AbnerMing"console.log("===是否相等:" + (string1 === string2))

同樣的場景,比如包含,使用正則也是不如直接使用自帶的Api判斷方便。

正則判斷是否包含某一個字符串:

 private isContains(a: string, b: string): boolean {const regExp = new RegExp(a, "g")return regExp.test(b)}

代碼判斷:

 const string1: string = "我是AbnerMing,是一個程序員."const string2: string = "一個"const isContains = this.isContains(string2, string1)console.log("===是否包含:" + isContains)

針對字符串的包含判斷,我們也完全可以使用已有的方法進行判斷。

比如search方法:

const string1: string = "我是AbnerMing,是一個程序員."
const string2: string = "一個"
const isContains = string1.search(string2) != -1
console.log("===是否包含:" + isContains)

比如indexOf方法:

const string1: string = "我是AbnerMing,是一個程序員."
const string2: string = "一個"
const isContains = string1.indexOf(string2) != -1
console.log("===是否包含:" + isContains)

所以說,正則表達式固然很好,但是,在實際的開發中,我們也要針對性的選擇去用,讓它在該有的場景中發揮最大的作用。

了解正則及RegExp

在鴻蒙當中使用正則和TypeScript中如出一轍。

首先需要定義一個正則表達式。

const reg = new RegExp('正則表達式');

使用正則表達式

const res = reg.test('內容'); 
console.info('===結果:', res);

RegExp對象中,目前有兩個方法,一個是test方法,一個是exec方法。

test

此方法,返回一個Boolean,用來查找對應的字符串中是否存在,這個方法是使用最多的,常見的規則判斷一般都是使用它。

exec

此方法,用來查找并返回當前的匹配結果,并以數組的形式返回。

顯而易見,test方法可以判斷,是否符合正則表達式,可以用于判斷手機號,郵箱等等是否符合等等場景,而exec方法更側重于,查找相符合的數據。

常見元字符

元字符?是一個比較特殊的字符,也是一種特殊規則的文本,主要用于規定前導字符在目標對象中的出現模式,比如匹配數字,匹配字母等等匹配一定規則的文本,常見的元字符如下:

字符匹配

普通字符:直接按照給定的文本進行匹配,比如,一段文本中,匹配到字母“A”的字符。

元字符:元字符上面已經說了,它是具有特殊的含義,例如 \d 匹配任意數字字符,\w 匹配任意字母數字字符,. 匹配任意字符(除了換行符)等。

量詞

*:匹配前面的模式零次或多次
+:匹配前面的模式一次或多次
?:匹配前面的模式零次或一次
{n}:匹配前面的模式恰好 n 次
{n,}:匹配前面的模式至少 n 次
{n,m}:匹配前面的模式至少 n 次且不超過 m 次

字符類

[]:匹配括號內的任意一個字符。例如,[abc] 匹配字符 “a”、“b” 或 “c”
[^ ]:匹配除了括號內的字符以外的任意一個字符。例如,[^abc] 匹配除了字符 “a”、“b” 或 “c” 以外的任意字符

邊界匹配

^:匹配字符串的開頭
$:匹配字符串的結尾
\b:匹配單詞邊界
\B:匹配非單詞邊界

分組和捕獲

( ):用于分組和捕獲子表達式
(?: ):用于分組但不捕獲子表達式

特殊字符

\:轉義字符,用于匹配特殊字符本身
.:匹配任意字符(除了換行符)
|:用于指定多個模式的選擇
數字

數字:^[0-9]*$
n位的數字:^\d{n}$
至少n位的數字:^\d{n,}$
m-n位的數字:^\d{m,n}$
零和非零開頭的數字:^(0|[1-9][0-9]*)$
非零開頭的最多帶兩位小數的數字:^([1-9][0-9]*)+(.[0-9]{1,2})?$
帶1-2位小數的正數或負數:^(-)?\d+(.\d{1,2})?$
正數、負數、和小數:^(-|+)?\d+(.\d+)?$
有兩位小數的正實數:^[0-9]+(.[0-9]{2})?$
有1~3位小數的正實數:^[0-9]+(.[0-9]{1,3})?$
非零的正整數:^[1-9]\d*$ 或 ^([1-9][0-9]){1,3}$ 或 ^+?[1-9][0-9]$
非零的負整數:^-[1-9][]0-9"$ 或 ^-[1-9]\d$
非負整數:^\d+$ 或 ^[1-9]\d*|0$
非正整數:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
非負浮點數:^\d+(.\d+)?$ 或 1\d*.\d*|0.\d*[1-9]\d*|0?.0+|0$
非正浮點數:^((-\d+(.\d+)?)|(0+(.0+)?))$ 或 ^(-([1-9]\d*.\d*|0.\d*[1-9]\d*))|0?.0+|0$
正浮點數:^[1-9]\d*.\d*|0.\d*[1-9]\d*$ 或 ^(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9]))$
負浮點數:^-([1-9]\d*.\d*|0.\d*[1-9]\d*)$ 或 ^(-(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9])))$
浮點數:^(-?\d+)(.\d+)?$ 或 ^-?([1-9]\d*.\d*|0.\d*[1-9]\d*|0?.0+|0)$

校驗字符的表達式

漢字:^[\u4e00-\u9fa5]{0,}$
英文和數字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
長度為3-20的所有字符:^.{3,20}$
由26個英文字母組成的字符串:^[A-Za-z]+$
由26個大寫英文字母組成的字符串:^[A-Z]+$
由26個小寫英文字母組成的字符串:^[a-z]+$
由數字和26個英文字母組成的字符串:^[A-Za-z0-9]+$
由數字、26個英文字母或者下劃線組成的字符串:^\w+$ 或 ^\w{3,20}$
中文、英文、數字包括下劃線:^[\u4E00-\u9FA5A-Za-z0-9_]+$
中文、英文、數字但不包括下劃線等符號:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
可以輸入含有^%&',;=?KaTeX parse error: Expected group after '^' at position 8: \"等字符:[^?%&',;=?\x22]+
禁止輸入含有的字符:[^\x22]+

特殊需求表達式

Email地址:^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+.)+[\w-]+(/[\w-./?%&=]*)?$
手機號碼(可根據目前國內收集號擴展前兩位開頭號碼):^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
電話號碼(“XXX-XXXXXXX”、“XXXX-XXXXXXXX”、“XXX-XXXXXXX”、“XXX-XXXXXXXX”、"XXXXXXX"和"XXXXXXXX):^((\d{3,4}-)|\d{3.4}-)?\d{7,8}$
國內電話號碼(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
15位身份證號:2\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$
18位身份證號:3\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$
帳號是否合法(字母開頭,允許5-16字節,允許字母數字下劃線):4[a-zA-Z0-9_]{4,15}$
密碼(以字母開頭,長度在6~18之間,只能包含字母、數字和下劃線):^[a-zA-Z]\w{5,17}$
強密碼(必須包含大小寫字母和數字的組合,不能使用特殊字符,長度在8-10之間):^(?=.\d)(?=.[a-z])(?=.*[A-Z]).{8,10}$
日期格式:^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$,例如:2014-10-12
^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\s+(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d$,例如:2014-10-12 12:20:00
一年的12個月(01~09和1~12):^(0?[1-9]|1[0-2])$
一個月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$
錢的輸入格式:
有四種錢的表示形式我們可以接受:“10000.00” 和 “10,000.00”, 和沒有 “分” 的 “10000” 和 “10,000”:^[1-9][0-9]*$
這表示任意一個不以0開頭的數字,但是,這也意味著一個字符"0"不通過,所以我們采用下面的形式:^(0|[1-9][0-9]*)$
一個0或者一個不以0開頭的數字.我們還可以允許開頭有一個負號:^(0|-?[1-9][0-9]*)$
這表示一個0或者一個可能為負的開頭不為0的數字.讓用戶以0開頭好了.把負號的也去掉,因為錢總不能是負的吧.下面我們要加的是說明可能的小數部分:^[0-9]+(.[0-9]+)?$
必須說明的是,小數點后面至少應該有1位數,所以"10."是不通過的,但是 “10” 和 “10.2” 是通過的:^[0-9]+(.[0-9]{2})?$
這樣我們規定小數點后面必須有兩位,如果你認為太苛刻了,可以這樣:^[0-9]+(.[0-9]{1,2})?$
這樣就允許用戶只寫一位小數.下面我們該考慮數字中的逗號了,我們可以這樣:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
1到3個數字,后面跟著任意個 逗號+3個數字,逗號成為可選,而不是必須:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$
xml文件:^([a-zA-Z]±?)+[a-zA-Z0-9]+\.[x|X][m|M][l|L]$
中文字符的正則表達式:[\u4e00-\u9fa5]
雙字節字符:[^\x00-\xff] (包括漢字在內,可以用來計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1))
空白行的正則表達式:\n\s*\r (可以用來刪除空白行)
HTML標記的正則表達式:<(\S*?)[^>]>.?</\1>|<.*? />
騰訊QQ號:[1-9][0-9]{4,} (騰訊QQ號從10000開始)
中國郵政編碼:[1-9]\d{5}(?!\d) (中國郵政編碼為6位數字)
IP地址:\d+.\d+.\d+.\d+ (提取IP地址時有用)
IP地址:((?😦?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))

正確使用正則

應用代碼

let regex: RegExp = /\s*/g;

建議改法

let regexp: RegExp = new RegExp('\\s*','g');

原因

如果正則表達式中使用了標志符,需要將其作為new RegExp()的參數。

簡單舉例

上面的元字符中,已經給出了大量的匹配規則,大家直接套用即可,比如判斷是否是一個郵箱,代碼如下:

 private isEmail(txt: string): boolean {const regExp = new RegExp('^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$')return regExp.test(txt)}

相關總結

合理的使用正則表達式,確實在實際的開發中能給我們帶來一定的便利,特別是在一些復雜的匹配時,能夠帶來高效的查找,也能夠提高我們的開發效率,但在處理極度復雜任務時可能需要結合其他工具。

在開發中,對于輸入的規則是否是RegExp類型,我們可以通過系統提供的isRegExp來進行判斷,代碼如下:

let type = new util.types()
let result = type.isRegExp(new RegExp('abc'))
console.info("=== " + result);

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64572.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64572.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64572.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kafka的acks機制和ISR列表

Kafka 是一個流行的分布式流處理平臺&#xff0c;用于構建實時數據流管道和應用程序。在 Kafka 中&#xff0c;acks 機制和 ISR&#xff08;In-Sync Replicas&#xff09;列表是兩個重要的概念&#xff0c;它們共同確保消息的持久性和可靠性。 acks 機制 acks 機制是 Kafka 生…

在 Ubuntu 下通過 Docker 部署 Caddy 服務器

嘿&#xff0c;伙伴們&#xff01;今天我們來聊聊如何在 Ubuntu 系統下通過 Docker 部署 Caddy 服務器。Caddy 是一個現代的 Web 服務器&#xff0c;支持自動 HTTPS&#xff0c;簡單易用&#xff0c;特別適合快速搭建網站。而 Docker 則是一個讓你可以隔離和管理應用的神器。結…

計算機網絡?自頂向下方法:網絡層介紹、路由器的組成

網絡層介紹 網絡層服務&#xff1a;網絡層為傳輸層提供主機到主機的通信服務 每一臺主機和路由器都運行網絡層協議 發送終端&#xff1a;將傳輸層報文段封裝到網絡層分組中&#xff0c;發送給邊緣路由器路由器&#xff1a;將分組從輸入鏈路轉發到輸出鏈路接收終端&#xff1…

Linux top指令

top指令概述 top 是 Linux 系統中用于實時監控系統性能和進程信息的命令&#xff0c;功能強大且靈活。它提供了系統資源的動態視圖&#xff0c;包括 CPU、內存、運行中的進程等。 這個指令可以說是Linux中最基本的工具了&#xff0c;用來監視系統的實時運行狀態&#xff0c;類…

Qt監控系統放大招/歷經十幾年迭代完善/多屏幕輔屏預覽/多層級設備樹/網絡登錄和回放

一、前言說明 近期對視頻監控系統做了比較大的更新升級&#xff0c;主要就是三點&#xff0c;第一點就是增加了輔屏預覽&#xff0c;這個也是好多個客戶需要的功能&#xff0c;海康的iVMS-4200客戶端就有這個功能&#xff0c;方便在多個屏幕打開不同的視頻進行查看&#xff0c…

網絡原理(六): UDP 協議

目錄 1. UDP 協議 1.1 協議特點 1.2 協議報文格式 1.2.1 UDP 長度 1.2.2 校驗和 1. UDP 協議 在進行網絡編程時, 我們已經對 UDP 協議進行了簡單了解. 并且應用層的很多操作, 需要調用傳輸層的提供的接口, 基于 socket api 來進行完成的. 1.1 協議特點 UDP 協議具有以…

前端頁面展示本電腦的攝像頭,并使用js獲取攝像頭列表

可以通過 JavaScript 使用 navigator.mediaDevices.enumerateDevices() 獲取電腦上的攝像頭列表。以下是一個示例代碼&#xff0c;可以展示攝像頭列表并選擇進行預覽。 HTML JavaScript 實現攝像頭列表展示和預覽 <!DOCTYPE html> <html lang"zh-CN">…

【漫話機器學習系列】028.CP

Mallows’ Cp&#xff1a;標準化公式解析與應用 Mallows’ Cp 是一種常用的模型選擇工具&#xff0c;用于在一系列候選模型中權衡擬合度和復雜性&#xff0c;幫助我們選擇性能最優的模型。本文將基于其標準化公式展開詳細解析&#xff0c;并探討其應用場景、實現方法、優點與局…

期末算法分析程序填空題

目錄 5-1 最小生成樹&#xff08;普里姆算法&#xff09; 5-2 快速排序&#xff08;分治法&#xff09; 輸入樣例&#xff1a; 輸出樣例&#xff1a; 5-3 歸并排序(遞歸法) 輸入樣例&#xff1a; 輸出樣例&#xff1a; 5-4 求解編輯距離問題&#xff08;動態規劃法&#xff09;…

深入解析 Conda 安裝的默認依賴包及其作用:conda create安裝了哪些包(中英雙語)

深入解析 Conda 安裝的默認依賴包及其作用 當我們使用 Conda 創建新環境時&#xff0c;例如執行命令&#xff1a; conda create -n olmes python3.10Conda 會自動為我們安裝一系列基礎依賴包&#xff0c;保證 Python 環境能夠正常運行。這些包不僅是我們開發的基礎工具&#…

Mac、Linux命令

Linux 查本機IP&#xff1a;ip addr 查詢文件里符合條件的字符串&#xff1a;grep Mac 查本機IP&#xff1a;ipconfig

Visual Studio 中增加的AI功能

前言&#xff1a; 人工智能的發展&#xff0c;在現在&#xff0c;編程技術的IDE里面也融合了AI的基本操做。本例&#xff0c;以微軟的Visual Studio中的人工智能的功能介紹例子。 本例的環境&#xff1a; Visual Studio 17.12 1 AI 智能變量檢測&#xff1a; 上圖展示了一…

江科大學習筆記之——HAL庫點亮一個LED燈

HAL三步走&#xff1a;1.建工程。2.設配置。3.寫代碼 一.建立工程 HAL庫寫法 點擊FinIsh 2.配置時鐘 2 、設置配置參數 把模塊.C.h單獨設置文件 生產代碼 三寫代碼 控制GPIO就三步 1.RCC時鐘使能 2.結構體配置GPIO寄存器 3.控制GPIO值 上面的步驟已經把前兩步的配置完成了接下…

Spring MVC (下)小項目實戰

1. 加法計算器 需求分析: 客戶端輸入倆個數,服務端進行相加然后返回結果. 約定前后端交互接口: 接口的概念: 接口?叫API&#xff08;ApplicationProgrammingInterface),我們?般講到 接口或者API&#xff0c;指的都是同?個東西.是指應?程序對外提供的服務的描述,?于交換信…

在K8S中,如何查看Pod狀態的詳情?事件顯示cpu不足如何處理?

在Kubernetes中&#xff0c;查看Pod狀態的詳細通常設計使用kubectl命令行工具&#xff0c;這是kubernetes提供的一個強大的管理工具。以下是如何查看Pod狀態詳情的步驟&#xff1a; 1. 查看Pod狀態詳情 列出所有Pod&#xff1a; 使用kubectl get pods命令可以查看集群所有Po…

詳細講一下React中的路由React Router

1. 基本概念 React Router 是 React 的路由管理庫&#xff0c;用于在 React 應用中實現頁面導航和路由控制。 2. 安裝 npm install react-router-dom 3. 基礎用法 // App.jsx import { BrowserRouter, Routes, Route, Link } from react-router-domfunction App() {return (…

人工智能的視覺天賦:一文讀懂卷積神經網絡

什么是CNN&#xff1f; CNN&#xff0c;全稱為卷積神經網絡&#xff08;Convolutional Neural Network&#xff09;&#xff0c;是一種模擬人類視覺感知機制的人工神經網絡。它通過層疊的卷積、池化等操作&#xff0c;從數據中提取關鍵特征&#xff0c;進而完成分類、識別或預…

【OpenGL ES】GLSL基礎語法

1 前言 本文將介紹 GLSL 中數據類型、數組、結構體、宏、運算符、向量運算、矩陣運算、函數、流程控制、精度限定符、變量限定符&#xff08;in、out、inout&#xff09;、函數參數限定符等內容&#xff0c;另外提供了一個 include 工具&#xff0c;方便多文件管理 glsl 代碼&a…

使用 ECharts 與 Vue 構建數據可視化組件

在前端開發中&#xff0c;數據可視化是非常重要的一部分。ECharts 作為一個功能強大且易于使用的開源數據可視化庫&#xff0c;被廣泛應用于各種圖表展示需求中。而 Vue.js 是當下流行的前端框架之一&#xff0c;它的數據驅動和組件化開發模式讓我們能輕松地將 ECharts 集成到 …

RPA系列-uipath 學習筆記4

使用Uipath 處理hover的問題 備注&#xff1a;使用uipath stversion&#xff1a;2024.10.6,所有學習來源自uipath Academy 首先&#xff0c;打開uipath給我們提供的一個網站 ACME,這個網站呢&#xff0c;需要提前注冊一下的哈。 今天呢&#xff0c;就是記錄一下&#xff0c;怎…