如何在JavaScript regexp中获取子模式的索引?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何在JavaScript regexp中获取子模式的索引?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2045字,纯文字阅读大概需要3分钟。
内容图文
![如何在JavaScript regexp中获取子模式的索引?](/upload/InfoBanner/zyjiaocheng/793/fef48f8fcfee4136a96cdd456f2a65d2.jpg)
我在JavaScript中编写了一个正则表达式,用于在字符串中搜索searchingUrl:
var input = '1234 url( test ) 5678';
var searchedUrl = 'test';
var regexpStr = "url\\(\\s*"+searchedUrl+"\\s*\\)";
var regex = new RegExp(regexpStr , 'i');
var match = input.match(regex);
console.log(match); // return an array
输出:
["url( test )", index: 5, input: "1234 url( test ) 5678"]
现在我想获得searchingUrl的位置(在上面的例子中它是1234 url??(test)5678中的测试位置.
我怎样才能做到这一点?
解决方法:
据我所知,不可能自动获得子匹配的偏移量,你必须自己使用RegExp的lastIndex或exec()返回的匹配对象的index属性进行计算.根据您的使用情况,您必须添加或减去导致您的子匹配的组的长度.但是,这确实意味着您必须将正则表达式的第一部分或最后部分分组,直到您希望找到的模式.
lastIndex似乎只在使用/ g / global标志时起作用,它将在整个匹配后记录索引.因此,如果您希望使用lastIndex,则需要从模式的末尾开始向后工作.
有关exec()方法的更多信息,请参见此处:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec
以下简洁地显示了运行中的解决方案:
var str = '---hello123';
var r = /([a-z]+)([0-9]+)/;
var m = r.exec( str );
alert( m.index + m[1].length ); // will give the position of 123
更新
这将适用于您的问题使用以下内容:
var input = '1234 url( test ) 5678';
var searchedUrl = 'test';
var regexpStr = "(url\\(\\s*)("+searchedUrl+")\\s*\\)";
var regex = new RegExp(regexpStr , 'i');
var match = regex.exec(input);
然后,要获得子匹配偏移量,您可以使用:
match.index + match[1].length
match [1]现在包含url((加两个空格),因为括号分组允许我们告诉内部偏移.
更新2
显然,如果您希望在要查找的实际模式之前在RegExp中具有要分组的模式,则事情会稍微复杂一些.这只是将每个组长度加在一起的简单操作.
var s = '~- [This may or may not be random|it depends on your perspective] -~';
var r = /(\[)([a-z ]+)(\|)([a-z ]+)(\])/i;
var m = r.exec( s );
要获得它的偏移位置取决于您将使用的视角:
m.index + m[1].length + m[2].length + m[3].length;
显然,如果你知道RegExp的部分永远不会改变长度,你可以用硬编码的数值替换它们.但是,最好保留上面的.length检查,以防你或其他人改变你的表达式匹配.
内容总结
以上是互联网集市为您收集整理的如何在JavaScript regexp中获取子模式的索引?全部内容,希望文章能够帮你解决如何在JavaScript regexp中获取子模式的索引?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。