是否有一个允许使用正则表达式的 JavaScript 的 String.indexOf() 的版本?

17 浏览
0 Comments

是否有一个允许使用正则表达式的 JavaScript 的 String.indexOf() 的版本?

在JavaScript中,是否有一个类似于String.indexOf()的方法,可以接受一个正则表达式作为第一个参数,同时允许指定第二个参数?\n我需要执行类似于以下的操作:\n

str.indexOf(/[abc]/ , i);

\n以及\n

str.lastIndexOf(/[abc]/ , i);

\n虽然String.search()方法可以接受一个正则表达式作为参数,但它不允许我指定第二个参数!\n编辑:
\n这个问题比我最初想象的要困难,所以我编写了一个小的测试函数来测试所有提供的解决方案...它假设regexIndexOf和regexLastIndexOf已经添加到了String对象中。\n

function test (str) {
    var i = str.length +2;
    while (i--) {
        if (str.indexOf('a',i) != str.regexIndexOf(/a/,i)) 
            alert (['failed regexIndexOf ' , str,i , str.indexOf('a',i) , str.regexIndexOf(/a/,i)]) ;
        if (str.lastIndexOf('a',i) != str.regexLastIndexOf(/a/,i) ) 
            alert (['failed regexLastIndexOf ' , str,i,str.lastIndexOf('a',i) , str.regexLastIndexOf(/a/,i)]) ;
    }
}

\n我正在进行以下测试,以确保至少对于一个字符的正则表达式,结果与使用indexOf相同\n//在一连串的x中查找a
\ntest(\'xxx\');
\ntest(\'axx\');
\ntest(\'xax\');
\ntest(\'xxa\');
\ntest(\'axa\');
\ntest(\'xaa\');
\ntest(\'aax\');
\ntest(\'aaa\');

0
0 Comments

JavaScript的String.indexOf()方法可以用于查找字符串中第一次出现指定字符或子字符串的位置。然而,这个方法不能支持使用正则表达式进行匹配。因此,有人提出了一个问题,是否有一种版本的String.indexOf()方法可以支持正则表达式的匹配。

为了解决这个问题,有人提供了一个解决方案。首先,他们给出了一个简短的解决方案,使用match()方法进行正则表达式的匹配,然后使用indexOf()和lastIndexOf()方法查找匹配的第一个和最后一个出现的位置。这个解决方案对于他们来说很有效。

接下来,他们给出了一个原型版本的解决方案。他们为String对象添加了indexOfRegex()和lastIndexOfRegex()方法。这些方法接受一个正则表达式作为参数,并在字符串中查找匹配的第一个和最后一个出现的位置。如果找到匹配,就返回相应的索引;如果没有找到匹配,就返回-1。

为了使用这些方法,只需要简单地调用它们,传入相应的正则表达式作为参数。这个解决方案非常简单,并且可以很方便地在代码中使用。

然后,还有一些人提出了一些问题和改进意见。他们指出,原始的解决方案在某些情况下可能会出现问题,例如在单词的开头找到匹配时,返回的索引可能不正确。为了解决这个问题,他们给出了一些修改建议,并提供了相应的代码示例。

这个问题的出现是因为JavaScript的String.indexOf()方法不能支持正则表达式的匹配。为了解决这个问题,人们提出了一些解决方案,包括使用match()方法和修改原型方法。这些解决方案可以很方便地在代码中使用,提供了一种使用正则表达式进行字符串查找的方法。

0
0 Comments

JavaScript的String.indexOf()方法用于返回字符串中指定子字符串的第一个匹配项的索引。然而,它不支持使用正则表达式进行匹配。因此,有人提出了一个问题,是否存在一个类似于String.indexOf()的方法,可以支持使用正则表达式进行匹配。

为了解决这个问题,有人提供了两个函数:regexIndexOf和regexLastIndexOf。这些函数的代码如下:

function regexIndexOf(string, regex, startpos) {
    var indexOf = string.substring(startpos || 0).search(regex);
    return (indexOf >= 0) ? (indexOf + (startpos || 0)) : indexOf;
}
function regexLastIndexOf(string, regex, startpos) {
    regex = (regex.global) ? regex : new RegExp(regex.source, "g" + (regex.ignoreCase ? "i" : "") + (regex.multiLine ? "m" : ""));
    if(typeof (startpos) == "undefined") {
        startpos = string.length;
    } else if(startpos < 0) {
        startpos = 0;
    }
    var stringToWorkWith = string.substring(0, startpos + 1);
    var lastIndexOf = -1;
    var nextStop = 0;
    while((result = regex.exec(stringToWorkWith)) != null) {
        lastIndexOf = result.index;
        regex.lastIndex = ++nextStop;
    }
    return lastIndexOf;
}

这些函数的性能经过了测试,并且在大多数情况下可以正常工作。然而,有人指出`regexLastIndexOf`函数只能返回最后一个非重叠匹配项的索引,而不能返回所有匹配项的索引。为了解决这个问题,有人提出了使用`regex.lastIndex = result.index + 1`代替`regex.lastIndex = ++nextStop`的方法,以提高性能并确保返回所有匹配项的索引。

除了这些函数,还某些情况下了一个关于使用多个JSON对象或多个满足正则表达式的部分的情况。这个问题没有得到解决,但提供了一个指向NPM上类似功能的工具函数的链接。

虽然JavaScript的String.indexOf()方法不支持使用正则表达式进行匹配,但可以使用自定义的regexIndexOf和regexLastIndexOf函数来实现这个功能。这些函数的代码经过了测试并且可以正常工作,但仍然有一些限制和改进的空间。

0
0 Comments

JavaScript的String.indexOf()方法用于返回字符串中首次出现的指定值的索引。然而,它不支持正则表达式搜索。有人提出了一个问题,是否有一种类似于String.indexOf()的方法,可以支持正则表达式搜索。

事实上,String构造函数的实例有一个.search()方法,可以接受一个正则表达式作为参数,并返回第一个匹配项的索引。如果想从特定位置开始搜索(模拟String.indexOf()的第二个参数),可以使用slice方法切掉前面的i个字符,然后再进行搜索。但是,这样得到的索引是在切割后的较短字符串中的索引,所以如果索引不是-1,还需要加上切割部分的长度i,才能得到原始字符串中的索引。因此,可以定义一个函数regexIndexOf(text, re, i),实现这个功能。

另一种解决方法是使用substr方法,在偏移量i处开始切割字符串,然后进行搜索。但是,这种方法的输出结果与indexOf方法有所不同。indexOf方法返回从字符串开头开始的位置,而substr方法返回从偏移量开始的位置。为了保持一致,可以修改函数为regexIndexOf(text, offset),在初始索引initial大于等于0时,将其加上偏移量offset。

然而,上述代码在i未定义(可选参数)时将无法正常工作。为了更加健壮,可以添加输入检查,修改函数为regexIndexOf(text, re, i)。在内部,首先判断i是否存在且大于0,如果是,则使用substr方法进行搜索;否则,使用search方法进行搜索。最后,如果索引小于0,则直接返回索引;否则,返回索引加上(i存在则为i,否则为0)。

通过对String.indexOf()方法的不足进行分析,提出了一种基于正则表达式搜索的解决方法,并给出了两种实现方式。通过这些解决方案,可以满足开发者在使用JavaScript时对于支持正则表达式搜索的需求。

0