程式狂想筆記

一個攻城師奮鬥史

0%

Regex 豎旗(flag)的那些事情

很常去搞正規化
但卻沒有認真了解裡面的事情
今天一口氣記錄
其實仔細看也沒很多(= =a)

flag

  • g Global search.
  • i Case-insensitive search.
  • m Multi-line search.
  • u unicode; treat a pattern as a sequence of unicode code points
  • y Perform a “sticky” search that matches starting at the current position in the target string. See RegExp.prototype.sticky | MDN

心裡疑惑

其實我對g這個也滿疑惑的
什麼是全域查詢
平常用 sublime 或 vscode 都沒有這個搜尋選項

m多行模式
也讓我很疑惑,是找多行,但感覺跟g有關係
可以找多筆

regex 101 產生 JavaScript 語法
exec怎麼可以做 while 迴圈

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const regex = /test/gm;
const str = `test`;
let m;

while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}

// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}

研究結果

m看是否需要一行一行搜尋,通常可能需要搭配g才能找出多行資料
一般沒用m算單行模式
從這篇來看到正則表達式之單行模式、多行模式、區分大小寫模式 - ^小七 - 博客園 備份圖

單行模式: (.)點號不匹配換行符,在 windows 中與[^\r\n]等價,並不是刻意匹配任意字符,在單行模式下會改變點號的含義,做到匹配任意字符 s
多行模式: 多行模式下^和\$的含義會被改變,普通的含義是匹配整個字符串的開頭和結尾,在多行模式下匹配的就是每一行的行首和行尾,而\A 和\Z 他們的含義始終是匹配整個字符串的開頭和結尾
再看這個範例,可以看出差異Multiple Strings - Regex Tester/Debugger
簡單來說就是^xxx$才會看出差異

g其實跟持續搜尋有關係(如:js),但是 php 會用不同函式(preg_match_all,preg_match),可以自己玩玩看 regex101
可參考:[ JS 进阶 ] test, exec, match, replace - kraaas 前端博客 - SegmentFault 思否

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var reg = /\d/;
//第一次匹配
console.log(reg.exec('a123'));
console.log(reg.lastIndex);
//输出
["1"]
0

第二次匹配
console.log(reg.exec('a123'));
console.log(reg.lastIndex);
//输出
["1"]
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
var reg = /\d/g;
//第一次匹配
console.log(reg.exec('a123'));
console.log(reg.lastIndex);
//输出
["1"]
2

第二次匹配
console.log(reg.exec('a123'));
console.log(reg.lastIndex);
//输出
["2"]
3

第三次匹配
console.log(reg.exec('a123'));
console.log(reg.lastIndex);
//输出
["3"]
4

第四匹配
console.log(reg.exec('a123'));
console.log(reg.lastIndex);
//输出
null
0

regex 物件有 exec,test,參數是帶 string
string 型態有 match,參數是帶 regex

要注意 regex exec 跟 test 都吃gflag
test 回傳只會傳 true,false
exec 回傳比較特殊,傳回來是一個 array
当设置全局标志的正则使用 test | MDN>)
感覺一不小心結果會得到不一樣的結果

unicode、sticky 好像都是 ES6 東西,先暫時不研究。

正则的扩展 - ECMAScript 6 入门
Edit fiddle - JSFiddle

[JS] RegExp 參數的正確姿勢 備份圖
正则表达式多行匹配及声明标识 - hongweigg 的专栏 - CSDN 博客
正则表达式之单行模式、多行模式、区分大小写模式 - ^小七 - 博客园