JavaScript正则expression式\ G +抵消等效
JavaScript正则expression式中有\G
的等价物吗? 我需要匹配一个确切的偏移模式。 设置g
标志和.lastIndex
从给定的索引向前search,但不会精确匹配到偏移量。
XRegExp有这个y
修饰符,这可能是我正在寻找,但它似乎不能在Node / V8中工作。
我认为你唯一能做的就是把.lastIndex
设置为你的出发点,用.exec()
匹配,如果匹配,检查.lastIndex
的更新值。 如果它等于你的起始位置加上比赛结果的长度,那么比赛就开始在你想要的地方。
所以:
var re = /banana/g; re.lastIndex = 6; var mr = re.exec("hello banana"); if (mr[0].length + 6 === re.lastIndex) alert("good banana");
我永远不会说这是一种“好”的做事方式,而是我所知道的唯一可能性。
做了一些hackery:
var XRegExp = require('xregexp').XRegExp; function makeOffsetPatt(patt, flags) { if(_.isUndefined(flags)) flags = 'gnsm'; return XRegExp('(?:'+patt+')|(?<__NO_MATCH>)', flags); } XRegExp.prototype.match = function(str, offset) { var result = XRegExp.exec(str, this, offset); if(result === null || !_.isUndefined(result.__NO_MATCH)) return null; delete result.__NO_MATCH; return result; }; var word = makeOffsetPatt('\\w+'); console.log(word.match('html { head {')); console.log(word.match('html { head {',4)); console.log(word.match('html { head {',7));
输出:
[ 'html', index: 0, input: 'html { head {' ] null [ 'head', index: 7, input: 'html { head {' ]
如果你的模式没有find,它会尝试匹配一个空string,而应该总是成功。 然后我检查这个空匹配的存在以确定你的模式是否失败,清理匹配对象并返回它。