RegExp 定点标识

142 阅读1分钟

定点:指正则表达式的一个虚拟的锚点,字符会从正则表达式的lastIndex属性指定 的位置开始匹配。

格式/正则匹配规则/y

示例

  • 常规
    var re1 = /foo/,
    str = "++foo++";
    
    re1.lastIndex;  // 0
    re1.test( str ); // tue
    re1.lastIndex; // 0
    re1.lastIndex = 4; // lastIndex 修改为 4
    re1.test( str ); // true,忽略lastIndex还是从0开始匹配
    re1.lastIndex; // 4
    
  • 定点标示
    var re1 = /foo/y, // <-- 注意有y!
    str = "++foo++";
    
    re1.lastIndex;  // 0
    re1.test( str ); // false 匹配失败后 lastIndex会被重置为0
    re1.lastIndex; // 0 
    
    re1.lastIndex = 2;  // 从 能匹配到(2)的位置开始匹配
    re1.test( str ); // true
    
    re1.lastIndex; // 5  匹配成功后 lastIndex会被往后挪
    
    re1.test( str ); // false 匹配失败后 lastIndex会被重置为0
    re1.lastIndex;  // 0
    

match中的用法

var re = /\d+\.\s(.*?)(?:\s|$)/y;
str = "1. foo 2. bar 3. baz";

str.match( re ); // [ "1. foo ", "foo" ]
re.lastIndex; // 7-- 匹配成功后 lastIndex会被往后挪

str.match( re ); // [ "2. bar ", "bar" ]
re.lastIndex; // 14-- 匹配成功后 lastIndex会被往后挪

str.match( re ); // ["3. baz", "baz"]
re.lastIndex; // 20-- 匹配成功后 lastIndex会被往后挪

str.match( re ); // null 未匹配到
re.lastIndex; // 匹配失败后 lastIndex会被重置为0

exec中的类似用法

var re = /o+./g, // <-- 注意g!
str = "foot book more";

re.exec( str ); // ["oot"]
re.lastIndex; // 4

re.exec( str ); // ["ook"] 
re.lastIndex;// 9

re.exec( str ); // ["or"]
re.lastIndex; // 13

re.exec( str ); // null 未匹配到
re.lastIndex; 匹配失败后 lastIndex会被重置为0

注意

y 加上 ^ 再加上 lastIndex > 0 是一个不兼容的组合,总是会导致匹配失败。 示例

var re = /^f\w{2}/y,
str = "foofaa";

re.test(str) // true 匹配成功后 lastIndex会被往后挪
re.lastIndex; // 3

re.test( str ); // false ^表示输入的起始处,re.lastIndex为3,匹配就会失败。
re.lastIndex; // 0 匹配失败后 lastIndex会被重置为0

对比

var re = /f\w{2}/y, // <-- 注意没有^!
str = "foofaa";

re.test(str) // true 匹配成功后 lastIndex会被往后挪
re.lastIndex; // 3

re.test( str ); // true
re.lastIndex; // 6 匹配成功后 lastIndex会被往后挪