正則是獨立於程式語言的一個學科,用於解決模式匹配問題,Javascript提供了對於正則支援,此外,Java、c、python也都支援正則。正則可以應用在:檢索,替換,爬蟲,論文查重等領域。
範例化正規表示式物件
正規表示式
直接量
abc 例如:/abc/ 查詢目標串中是否含有abc
字元類
[abc] 例如:/[abc]/ 查詢目標串中是否含有abc中任意一個字元
[^abc] 例如:/[^abc]/ 查詢目標串中是否含有除了abc之外任意一個字元
[a-z] a~z中的任意一個字元
\w 字母 [a-zA-Z0-9]
\W 非字母 [^a-zA-Z0-9]
\d 數位 [0-9]
\D 非數位[^0-9]
\s 空白符
\S 非空白符
多行模式下
^ 以…開始 /^\d\w{3}\d$/ 以為數位開頭,以數位結尾
$ 以…結尾
數量詞
數量一般使用在子表示式(直接量,字元類,分組…)後
/1[3578]\d{9}/
{9} 重複9次
{1,9} 重複1~9次
{1,} 重複1次及以上
{0,} 重複0次及以上
* 等價於{0,}
+ 等價於{1,}
? 等價於{0,1}
貪婪匹配
預設是貪婪匹配
{1,9} 優先匹配9次
非貪婪匹配
數量詞後新增?就成為了非貪婪匹配
{1,9}? 優先匹配1次
選擇
子表示式中間新增"|"表示選擇
例如:
/hello|hi/
分組
獲取目標字串中所有的url,並且分別拿到協定,ip,port,路徑
url 協定://ip:port/路徑
var pattern =
/(http|https|ftp|svn) \ : //((\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})|(www.\w{2,}.com)):?(\d{2,5})(/[a-z0-9/]{2,})/ig
/() : //(()|()): ()()/
var str = 「12hello12」
var str = 「871wrold871」
var str = 「871wrold888」var pattern = /(\d{2,})\w+\1/
API
1.範例屬性
RegExp.prototype.flags 標記
RegExp.prototype.source 正則字串
RegExp.prototype.ignoreCase
RegExp.prototype.global
RegExp.prototype.multiline
RegExp.prototype.unicode
RegExp.prototype.sticky
這裡有個簡單的例子來直接的理解這些屬性的作用:
var pattern = /hello/igm;
console.log(pattern);// /hello/gim
console.log("source:",pattern.source);// source: hello
console.log("flags:",pattern.flags);// flags: gim
console.log("ignoreCase:",pattern.ignoreCase);// ignoreCase: true
console.log("global:",pattern.global);// global: true
console.log("multiline:",pattern.multiline);// multiline: true
console.log("unicode:",pattern.unicode);// unicode: false
2.實體方法
RegExp.prototype.test(str)
目標字串中是否可以滿足正規表示式的匹配要求
支援全域性匹配。當全域性匹配的時候,會在正規表示式物件pattern上維 護一個變數 lastIndex,表示下次開始檢索的位置。
引數:字串
返回值:boolean
RegExp.prototype.exec(str)
從目標字串中獲取滿足正規表示式匹配要求的子串。
支援全域性匹配。當全域性匹配的時候,會在正規表示式物件pattern上維護一個變數,lastIndex,表示下次開始檢索的位置。
引數:字串
返回值:陣列
陣列元素為匹配的結果
exec的返回值的陣列中的第一個元素整體匹配的結果, 第二個元素為第一個分組結果, 第三個元素為第二個分組的結果
陣列屬性index表示當前子串在目標串中的位置,input表示目標串,groups表示分組
以下是一個檢索網址的例子:
//檢索網址
var str = "hello , i am terry, my website is http://134.175.154.93:8888/personal/index.html, ftp url is ftp://172.16.0.2
0/webui , my phone 18812345432, my friend is larry ,his telephone is 13710009999,his web site is http://www.larry.com/p
ersonal/my.index.html , his email is larry@briup. com, my other first is jacky, his telephoen is 17751229900";
//網址的正規表示式
var a = /(http|https|ftp|svn)\:\/\/((\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})|(www\.\w{2,}\.com))\:?(\d{2,5})?(\/[a-z0-9/]{2,
})/ig
let result = null;
while(result = a.exec(str)){
console.log(result);
}
輸出的結果:
[
'http://134.175.154.93:8888/personal/index',//整體的匹配結果
'http',//第一個分組結果
'134.175.154.93',
'134.175.154.93',
undefined,
'8888',
'/personal/index',
index: 34, //當前子串在目標串中的位置
input: 'hello , i am terry, my website is http://134.175.154.93:8888/personal/index.html, ftp url is ftp://172.16.0.20/webui , my phone 18812345432, my friend is larry ,his telephone is 13710009999,his web site is http://www.larry.com/personal/my.index.html , his email is larry@briup. com, my other first is jacky, his telephoen is 17751229900', //檢索的目標串
groups: undefined//分組
]
[
'ftp://172.16.0.20/webui',
'ftp',
'172.16.0.20',
'172.16.0.20',
undefined,
undefined,
'/webui',
index: 93,
input: 'hello , i am terry, my website is http://134.175.154.93:8888/personal/index.html, ftp url is ftp://172.16.0.20/webui , my phone 18812345432, my friend is larry ,his telephone is 13710009999,his web site is http://www.larry.com/personal/my.index.html , his email is larry@briup. com, my other first is jacky, his telephoen is 17751229900',
groups: undefined
]
[
'http://www.larry.com/personal/my',
'http',
'www.larry.com',
undefined,
'www.larry.com',
undefined,
'/personal/my',
index: 206,
input: 'hello , i am terry, my website is http://134.175.154.93:8888/personal/index.html, ftp url is ftp://172.16.0.20/webui , my phone 18812345432, my friend is larry ,his telephone is 13710009999,his web site is http://www.larry.com/personal/my.index.html , his email is larry@briup. com, my other first is jacky, his telephoen is 17751229900',
groups: undefined
]
總結
這篇是我在學習js正則時總結的一些基礎,掌握!