正则表达式'标志'是什么?

时间:2010-12-27 22:33:52

标签: javascript regex flags

MDN说:

  

执行“粘性”搜索   从当前开始的比赛   在目标字符串中的位置,使用   你好。

我不太明白。

3 个答案:

答案 0 :(得分:42)

正则表达式对象具有lastIndex属性,根据g(全局)和y(粘性)标志,它以不同的方式使用。 y(粘性)标记告诉正则表达式在lastIndex处查找匹配项,而lastIndex处的(不在字符串中更早或更晚)。

示例价值1024字:

var str =  "a0bc1";
// Indexes: 01234

var rexWithout = /\d/;
var rexWith    = /\d/y;

// Without:
rexWithout.lastIndex = 2;          // (This is a no-op, because the regex
                                   // doesn't have either g or y.)
console.log(rexWithout.exec(str)); // ["0"], found at index 1, because without
                                   // the g or y flag, the search is always from
                                   // index 0

// With, unsuccessful:
rexWith.lastIndex = 2;             // Says to *only* match at index 2.
console.log(rexWith.exec(str));    // => null, there's no match at index 2,
                                   // only earlier (index 1) or later (index 4)

// With, successful:
rexWith.lastIndex = 1;             // Says to *only* match at index 1.
console.log(rexWith.exec(str));    // => ["0"], there was a match at index 1.

// With, successful again:
rexWith.lastIndex = 4;             // Says to *only* match at index 4.
console.log(rexWith.exec(str));    // => ["1"], there was a match at index 4.
.as-console-wrapper {
  max-height: 100% !important;
}


兼容性说明

Firefox的SpiderMonkey JavaScript引擎多年来一直有y标志,但在ES2015(2015年6月)之前它不是规范的一部分。此外,很长一段时间Firefox在^断言方面有a bug in the handling of the y flag,但它在Firefox 43(有bug)和Firefox 47(没有)之间修复。很老版本的Firefox(比如说3.6)确实有y并且没有错误,所以这是后来发生的回归(未定义y标志的行为),然后得到固定的。

答案 1 :(得分:3)

答案 2 :(得分:0)

你可以在这里找到一个例子:

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/RegExp#Example.3a_Using_a_regular_expression_with_the_.22sticky.22_flag

除了恕我直言,这个例子应该是

var regex = /^(\S+) line\n?/y;

而不是

var regex = /(\S+) line\n?/y;

因为使用这一行,无论你说

,代码都会给出相同的结果
var regex = /(\S+) line\n?/y;

var regex = /(\S+) line\n?/g;