javascriptRegex

來源:互聯網
上載者:User

標籤:開始   參數   測試   停止   斷言   官網   false   返回   失敗   

1.這兩天看完慕課網的javascriptRegex做的筆記趕緊貼上來記錄一下

介紹個圖形化的正則圖例,表示很強大啊 官網http://regexper.com/ githup https://github.com/javallone/regexper-static

按照readme上的安裝完成後啟動

 

 服務啟動在127.0.0.1:8080上了,可以把之前你看不懂的正則放上去試試了。

附上js正則相關知識講解筆記


單詞匹配
\bis\b
單詞兩邊都不是字元

連結匹配
http:\/\/.+\.jpg
http://開頭以.jpg結尾的字元

http:(\/\/.+\.jpg)分組,用$1表示分組的內容\$1 再替換成 $1

日期替換
\d{4}[/-]\d{2}[/-]\d{2}四個數字開頭,連結-或/中括弧表示或者的意思,後面跟兩個數字
^\d{4}[/-]\d{2}[/-]\d{2}$ ^角括弧表示開頭 $表示結尾
^(\d{4})[/-](\d{2})[/-](\d{2})$分組 $1,$2,$3分別表示第一分組,第二分組,第三分組

regexp對象
javascript通過內建對象RegExp支援Regex
有兩種方法執行個體化RegExp對象
.字面量
ver reg = /\bis\b/g
‘He is a boy. this is a dog. Where is she?‘.replace(reg, ‘IS‘);
/g表示匹配全文
沒有加/g
"He IS a boy. this is a dog. Where is she?" 只匹配第一個
加/g
"He IS a boy. this IS a dog. Where IS she?"

.建構函式
var reg = new RegExp(‘\\bis\\b‘,‘g‘);
‘He is a boy. this is a dog. Where is she?‘.replace(reg, ‘IS‘);

修飾符
g:global 全文檢索搜尋,不添加,搜尋到第一個停止
i:ignorecase 忽略大小寫,預設大小寫敏感
m:multiple lines 多行搜尋
元字元
-原義文本字元
-元字元

元字元是在Regex中有特殊含義的非字母字元
. * + ? $ ^ .| \ () {} []
元字元
\t 水平定位字元
\v 垂直定位字元
\n 分行符號
\r 斷行符號符
\0 Null 字元
\f 換頁符
\cX 與X對應的控制字元 Ctrl + x
字元類
一般情況下Regex的一個字元對應字串一個字元
運算式ab\t的含義 ab加水平定位字元
匹配某類字元
我們可以使用元字元[]來構建一個簡單的類
類就是指符合某些特性的對象,一個泛指,而不是特指某個字元
運算式[abc]把字元a b c歸為一類,運算式可以匹配這類字元
‘a1b2c3d4‘.replace(/[abc]/g,‘x‘)
"x1x2x3d4"
字元類取反
使用元字元^建立 反向類/負向類
反向類的意思是不屬於某類的內容
運算式[^abc]表示 不是字元a b c 的內容
範圍類
Regex提供了範圍類
所以我們可以使用[a-z]來串連兩個字元表示從a 到 z 的任一字元
這是個閉區間,也就是包含a和z本身

樣本‘a1b2d3x4z9‘.replace(/[a-z]/g, ‘Q‘)結果"Q1Q2Q3Q4Q9"

在[]組成的類內部是可以連寫的[a-zA-Z]表示,大寫字母和小寫字母

在範圍裡面如果想匹配-在後面加一個-就可以了
‘2016-09-12‘.replace(/[0-9-]/g, ‘A‘);
預定義類
Regex提供了預定義類
.[^\r\n]除了斷行符號換行之外的所有字元
\d[0-9]數字字元
\D[^0-9]非數字字元
\s[\t\n\x0B\f\r]空白字元
\S[^\t\n\x0B\f\r]非空白字元
\w[a-zA-Z0-9]單詞字元(字母,數字底線)
\W[^a-zA-Z0-9]非單詞字元
舉例:匹配ab+數字+任一字元 正則表示 ab[0-9][^\n\t]用預定義類表示 ab\d.
邊界 Regex還提供了幾個常用的邊界匹配字元
^以xx開始
$以XX結束
\b單詞邊界
\B非單詞邊界
舉例: ‘this is a boy‘.replace(/is/g, ‘0‘);匹配結果為"th0 0 a boy"
加上單詞邊界 ‘this is a boy‘.replace(/\bis\b/g, ‘0‘);匹配結果為 "this 0 a boy"
加上非單詞邊界‘this is a boy‘.replace(/\Bis\b/g, ‘0‘); 匹配結果為 "th0 is a boy"

‘@[email protected]@‘.replace(/@./g, ‘Q‘);匹配結果為:"[email protected]"
‘@[email protected]@‘.replace(/^@./g, ‘Q‘);匹配結果為:"[email protected]@"
‘@[email protected]@‘.replace(/[email protected]$/g, ‘Q‘);匹配結果為:"@[email protected]"


/m樣本
var mulstr =‘@123\[email protected]\[email protected]\n‘
mulstr.replace(/^@\d/g, ‘X‘);
結果
"X23
@456
@789
"
mulstr.replace(/^@\d/gm, ‘X‘);
結果
"X23
X56
X89
"
量詞我們希望匹配一個連續出現20次數位字串 \d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d
?出現零次或者一次(最多出現一次)
+出現一次或多次(至少出現一次)
*出現零次或多次(任意次)
{n}出現n次
{n,m}出現n次到m次
{n,}至少出現n次 這個有用
最多十次 /d{0,10}
貪婪模式
\d{3-6}123456789都滿足正則,正則會一直匹配知道匹配失敗,這就是貪婪模式。
‘12345678‘.replace(/\d{3,6}/g, ‘x‘);匹配結果 "x78"
非貪婪模式
讓Regex儘可能少的匹配,也就是說一旦匹配成功匹配不再繼續嘗試就是貪婪模式
做法:在量詞後面加?
‘12345678‘.replace(/\d{3,6}?/g, ‘x‘);匹配結果"xx78"
分組:匹配字串Byron 連續出現3次的情境 Byron{3} 量詞是作用在離他最近的單詞的。
使用()可以達到分組的功能,使兩次作用於分組
(Byon){3}

或|
Byron|Casper 單詞出現兩個任意一個
舉例 ‘Byroncasper‘.replace(/Byron|casper/g, ‘x‘);匹配結果:"xx"
反向引用 2015-12-25 ==>12/25/2015
分組捕獲
‘2015-12-25‘.repalce(/(\d{4})-(\d{2})-(\d{2})/g, ‘$2/$3/$1‘) $1表示第一個分組
分組忽略
不希望捕獲的某些分組,只需要在分組內加上?:就可以了
(?:Byron).(ok)表示第一分組被忽略,$1匹配的就是ok
前瞻
Regex從文本頭部向尾部開始解析,文本尾部方向,稱為“前”
前瞻就是在Regex匹配到規則的時候,向前檢查是否符合斷言, 後顧和前瞻相反
javascript不支援後顧
符合和不符合特定斷言稱為肯定/正向匹配和否定/負向匹配

正向前瞻exp(?=assert)
負向前瞻exp(?!assert)

\w(?=\d)‘a2*3‘.replace(/w(?=\d)/g, ‘x‘); 不僅匹配單詞字元後面得是數字才行
對象屬性
.global 全文
.ignore case 大小寫
.multiline 多行
.lastIndex 當前運算式匹配內容的最後一個字元的下一個位置
.source Regex的文本字串
對象屬性設定以後不可以修改了
test和exec方法
RegExp.prototype.test(str)
用於測試字串參數中是否存在匹配Regex模式的字串
如果存在返回true,否則false
reg1 = /\w/;
reg2 = /\w/gim;


test()方法受到lastIndex影響
while(reg2.test(‘ab‘)){
console.log(reg2.lastIndex);
}
只會執行兩次,所以test() lastIndex影響到Regex ,不加上g就不會出現這樣的問題。
RegExp.prototype.exec(str)
使用Regex對字串執行搜尋,並將更新全域RegExp對象的屬性以反應匹配結果
如果沒有匹配的文本則返回null,否則返回一個結果數組

-index 聲明匹配文本的第一個字元的位置
-input 存放被檢索的字串string
非全域調用
調用非全域的RegExp對象的exec()時,返回資料
第一個元素是與Regex相匹配的文本位置
第二個元素是與RegExpObject的第一個子運算式相匹配的文本(如果有的話)
第三個元素是與RegExp對象的第二子運算式相匹配的文本,
例子
var reg3 = /\d(\w)\d;
var reg4 = /\d(\w)\d/g;
var ts = ‘1a2b3c4d5e‘;
var ret = reg3.exec(ts);

console.log(reg3.lastIndex + ‘\t‘ + ret.index + ‘\t‘ + ret.toString());
console.log(reg3.lastIndex + ‘\t‘ + ret.index + ‘\t‘ + ret.toString());
//非全域下lastIndex是不起作用的。
//這裡的while迴圈是因為有lastIndex,當第二次以後lastIndex就為false
while(ret = reg.exec(ts)){
console.log(reg4.lastIndex + ‘\t‘ + ret.index + ‘\t‘ + ret.toString());
}
String.protatype.search(reg)
.search()方法用於檢索字串中指定的子字串,或檢索與正則變大是相匹配的子字串
方法返回第一個匹配結果index,尋找不到返回-1
search方法不執行全域匹配,它會忽略g標誌。總是從頭開始
String.prototype.match(reg)
.match()方法將檢索字串,以找到一個或多個regexp 匹配文本
.regexp 是否具有標誌g對結果影響很大
非全域調用
.如果regexp 沒有標誌g,那麼match方法就只能在字串中執行一次匹配
.如果沒有找到任何匹配的文本,將返回null
.否則它將返回一個數組,其中存放了與它找到的匹配文本有關的資訊
他的結果和exec是一樣的
第一個元素是與Regex相匹配的文本位置
第二個元素是與RegExpObject的第一個子運算式相匹配的文本(如果有的話)
第三個元素是與RegExp對象的第二子運算式相匹配的文本,
全域調用
沒有找到任何匹配的子串,則返回null
如果找到了一個或多個匹配子串,則返回一個數組

數組元素中存放的是匹配的子串
String.prototype.splite()
splite()裡面傳入Regex。
String.prototype.replace(‘firstStr‘, ‘replaceStr‘)

 

javascriptRegex

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.