本文主要是介绍js 正則,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
*: 任意次數,等同於 {0,}
+: 至少一次,等同於 {1,}
?: 零或一次(有或沒有),等同於 {0,1}
() :用于将基本的单元合成一个大的单元
反斜線 \
/* 在「非」特殊字元前面使用反斜線時,表示要把反斜線後的字當作是特殊字元 */
regex = /\b/ // b 原本不是特殊字元,這個 b 要當成特殊字元/* 在特殊字元前面使用反斜線時,表示要把反斜線後的字當作是「非」特殊字元 */
regex = /if\(true/ // ( 原本是特殊字元,但這裡要當成非特殊字元
regex = /1\+2=3/ // + 原本是特殊字元,但這裡要當成非特殊字元
(?=xxx):是零宽断言抄,表示后面的字符串必须符合xxx这个正则表达式
\d
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
var reg=/(\d{3})+/ //必须是1个或多个的3个连续数字
console.log(reg.test('123')) // true ,匹配123
console.log(reg.test('1234567')) // true ,匹配123456
console.log(reg.test('12')) // flase
(?!pattern)
正向否定预查(negative assert),在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。
简单说,以 xxx(?!pattern)为例,就是捕获不以pattern结尾的内容xxx
例如"Windows(?!95|98|NT|2000)“能匹配"Windows3.1"中的"Windows”,但不能匹配"Windows2000"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
var reg=(?!\d) // 数字不允许后面跟着数字
匹配0或多个正好在它之前的那个字符。例如正则表达式。*意味着能够匹配任意数量的任何字符。 ? 匹配0或1个正好在它之前的那个字符。注意:这个元字符不是所有的软件都支持的。.*是指任何字符0个或多个,.?是指任何字符0个或1个.
.具有贪婪的性质,首先匹配到不能匹配为止,根据后面的正则表达式,会进行回溯。.?则相反,一个匹配以后,就往下进行,所以不会进行回溯,具有最小匹配的性质。
?表示非贪婪模式,即为匹配最近字符 如果不加?就是贪婪模式a.*bc 可以匹配 abcbcbc
去掉換行
let str = info.replace(/\n/g, '')
去掉空格
str.replace(/\s+/g, '')
去掉第一個空格
str.replace(/^\s*/g,"");
去掉最後一個空格
str.replace(/\s*$/g,"");
去掉兩側空格
str.replace(/(^\s*)|(\s*$)/g, "");
去掉換行
str.replace(/\n/g, '')
去掉終端特殊符號
有時候我們會獲取終端的字符串,而這些字符串有時候會加上樣式,
所以輸出的字符串可能像是 :
\u001b[31m 我是文字 \u001b[0m’
那麼我們如果只要中間的中文/英文的話就要採取正則
str.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, '')
過濾並獲取網址中的參數
首先這是在我業務邏輯上很常使用的方法,有的時候專案的頁面會由別的地方導向進來,而這個頁面有些的參數是由上一頁的頁面傳遞過來的,此時這些參數,我們會把它埋在網址裡面,而專案的頁面只需要從網址裡面提取這些參數即可,而這個時候我們大多數採用正則。
在開始之前,說明下我們埋參數的規則(這些邏輯規則有個公司規範會有稍微不同不過大同小異)
假設我們要在頁面傳遞id,則會
像這樣由?開始,甚至以#作為結束
?articleId=105671279
而一個以上的參數則會使用 & 作為連結
?articleId=105671279&client_id=523897891731
了解了這些規則以後,就可以使用正則,將這些參數提出
let regex = /[?&]([^=#]+)=([^&#]*)/g
接下來一步步來分析這行正則的意思
定義匹配的字符範圍: [ ]
例如 :
[a-zA-Z0-9]
: 匹配a到z 和 A到Z 和 0到9
[\s*]
: 匹配 空格或者*號
捕获性分组: ( )
(foo) (bar) \1 \2
: 匹配 foo bar foo bar
最少一次或多次: +
匹配前面的子表达式最少一次或多次
zo+
: 匹配 zoo ,但是無法匹配 z
零次或多次: *
匹配前面的子表达式零次或多次。例如
zo*
: 匹配 z 以及 zooooo 相當於 {0,}
接下來把上面的知識套用進來,可以這麼解釋 :
[?&]
: 匹配至少一个?&的字符
([^=#]+)
: 至少要有一個非 = 或者 # 的字符 ,且將這些分為一個分組
([^&#]*)
: 匹配非 &或者 # 的字符並且後面可以沒有或者有多個字串,且將這些分為一個分組
const str = 'https://editor.csdn.net/md/?articleId=105671279'
const regex = /[?&]([^=#]+)=([^&#]*)/g
// 匹配結果為 ?articleId=105671279
匹配完成後會得到 ?articleId=105671279 這樣的一串字符,但是更多時候我們需要的是把這樣的參數轉為key與屬性(對象類型),這個時候我們就可以使用 exce
exec()
exec() 方法在一个指定字符串中执行一个搜索匹配。返回一个结果数组或 null。
聽起來很文言文,簡單的意思就是,我們在上面的正則中使用了 () 捕獲性分組,這個時候exce()方法返回的數組就會依照 () 來切割返回,繼續拿我們上面匹配的例子:
const str = 'https://editor.csdn.net/md/?articleId=105671279'
const regex = /[?&]([^=#]+)=([^&#]*)/g
regex .exec(str);
/*返回 :
0: "?articleId=105671279"
1: "articleId"
2: "105671279"
*/
返回數組的第一個參數永遠是匹配成功的字符串 ?articleId=105671279
,而第二個參數則會是根據 正則當中使用 () 來分組匹配到的參數 這裡返回的是
articleId,而第三個參數則是對照第二個分組匹配到的參數以此類推,有了這樣的結果,我們就可以把它們整理成我們需要的格式
let params = {}let matchwhile ((match = regex.exec(url))) {params[match[1]] = match[2]}console.log(params)
/*輸出: {articleId: "105671279"}
*/
这篇关于js 正則的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!