你不需要索引。
在这种情况下,提供更多信息会得到更好的答案。我不能因此而责怪你;我们鼓励创建简单的测试用例并删除不相关的细节。
但是缺少一个重要的项目:您计划对该索引做什么。与此同时,我们都在追逐错误的问题。:-)
我觉得少了点什么;这就是我问你的原因。
正如您在评论中提到的,您希望在输入字符串中找到 URL 并以某种方式突出显示它,也许通过将其包装在<b></b>
标签等中:
'1234 url( <b>test</b> ) 5678'
(让我知道您是否通过“突出显示”表示其他意思。)
您可以使用字符索引来做到这一点,但是使用正则表达式本身有一种更简单的方法。
获取索引
但是既然你问了,如果你确实需要索引,你可以用这样的代码得到它:
var input = '1234 url( test ) 5678';
var url = 'test';
var regexpStr = "^(.*url\\(\\s*)"+ url +"\\s*\\)";
var regex = new RegExp( regexpStr , 'i' );
var match = input.match( regex );
var start = match[1].length;
这比其他答案中的代码要简单一些,但是它们中的任何一个都可以正常工作。这种方法的工作原理是将正则表达式锚定到字符串的开头,^
并将 URL 之前的所有字符放在一个带有()
. 该组字符串的长度match[1]
, 是您的索引。
切片和切块
一旦你知道你的字符串中的起始索引test
,你可以使用.slice()
或其他字符串方法来切割字符串并插入标签,可能使用如下代码:
// Wrap url in <b></b> tag by slicing and pasting strings
var output =
input.slice( 0, start ) +
'<b>' + url + '</b>' +
input.slice( start + url.length );
console.log( output );
这肯定会奏效,但它确实是在以艰难的方式做事。
另外,我遗漏了一些错误处理代码。如果没有匹配的 URL 怎么办?match
将会undefined
和match[1]
将会失败。但与其担心这个,让我们看看我们如何在没有任何字符索引的情况下做到这一点。
简单的方法
让正则表达式为您完成工作。这是整个事情:
var input = '1234 url( test ) 5678';
var url = 'test';
var regexpStr = "(url\\(\\s*)(" + url + ")(\\s*\\))";
var regex = new RegExp( regexpStr , 'i' );
var output = input.replace( regex, "$1<b>$2</b>$3" );
console.log( output );
这段代码在正则表达式中有三组,一组用于捕获 URL 本身,在 URL 之前和之后的组用于捕获其他匹配的文本,这样我们就不会丢失它。然后一个简单的.replace()
,你就完成了!
通过这种方式,您不必担心任何字符串长度或索引。如果找不到 URL,则代码可以正常工作:它会返回未更改的输入字符串。