动态

详情 返回 返回

正則表達式踩坑 - 动态 详情

1、正則表達式 只要加了 /g 屬性,在執行 RegExp 的 api 時,都需要注意 reg.lastIndex 屬性值的變化

RegExp.exec(string)

一個指定字符串中執行一個搜索匹配
exec(string): array || null

參數

string

返回值

  • 匹配成功

    • 返回一個數組,此數組的第 0 個元素是與正則表達式相匹配的文本,第 1 個元素是與 RegExpObject 的第 1 個子表達式相匹配的文本(如果有的話),第 2 個元素是與 RegExpObject 的第 2 個子表達式相匹配的文本(如果有的話),以此類推;
    • 除了數組元素和 length 屬性之外,exec() 方法還返回兩個屬性。index 屬性聲明的是匹配文本的第一個字符的位置。input 屬性則存放的是被檢索的字符串 string;
    • RegExp 沒有設置了 global 或 sticky 標誌位時,reg.lastIndex 為 0;
    • RegExp 設置了 global 或 sticky 標誌位時,reg.lastIndex 指向下次開始的位置,意味着可以反覆調用 exec 方法來遍歷字符串中的所有匹配文本;當 exec() 再也找不到匹配的文本時,它將返回 null,並把 lastIndex 屬性重置為 0
  • 匹配失敗
    返回 null

注意事項

  • RegExp 對象在設置了 設置了 global 或 sticky 標誌位之後,RegExp 對象會有狀態(會將上次匹配成功之後的位置記錄在 lastIndex 屬性中);
  • RegExp 對象在設置了 設置了 global 或 sticky 標誌位之後,如果在一個字符串中完成了一次模式匹配之後要開始檢索新的字符串,就必須手動地把 lastIndex 屬性重置為 0。

demo

const regex1 = RegExp("foo*", "g");
const str1 = "table football, foosball";
let array1;

while ((array1 = regex1.exec(str1)) !== null) {
  console.log(`Found ${array1[0]}. Next starts at ${regex1.lastIndex}.`);
  // expected output: "Found foo. Next starts at 9."
  // expected output: "Found foo. Next starts at 19."
}

參考

w3c exec
MDN exec

RegExp.test(string)

用來查看正則表達式與指定的字符串是否匹配
test(string): bool

參數

string

返回值

bool,匹配成功 true;失敗 false

注意事項

  • RegExp 對象在設置了 設置了 global 或 sticky 標誌位之後,RegExp 對象會有狀態(會將上次匹配成功之後的位置記錄在 lastIndex 屬性中);
  • RegExp 對象在設置了 設置了 global 或 sticky 標誌位之後,如果在一個字符串中完成了一次模式匹配之後要開始檢索新的字符串,就必須手動地把 lastIndex 屬性重置為 0。
  • 只要部分匹配就會返回 ture,需要添加 ^ $

參考

MDN test

前後加 ^ $

RegExp.exec(string) 與 RegExp.test(string) 注意事項

當設置了全局標誌的 RegExp 對象使用時,一定要注意 lastIndex 的值變化;注意根據需要,修改 lastIndex(比如同一個正則,匹配 A 字符串之後,再去匹配 B 字符串)

string.match(RegExp)

檢索返回一個字符串匹配正則表達式的結果
string.match(RegExp):array || null

參數

RegExp

返回值

  • 匹配成功

    • 數組,RegExp 帶有g全局標誌,返回所有匹配項
    • 數組,RegExp 不帶有g全局標誌,返回第一個匹配項
  • 匹配事變
    null

string.match(RegExp) 與 RegExp.exec(string)

如果正則表達式不包含 g 標誌,str.match() 將返回與 RegExp.exec(). 相同的結果。

Add a new 评论

Some HTML is okay.