javascript - js提取字符串 - node js分割字符串




如何检查一个字符串“StartsWith”是否是另一个字符串? (12)

.lastIndexOf另一种替代.lastIndexOf

haystack.lastIndexOf(needle, 0) === 0

这从haystack的索引0开始,通过haystack向后看起来是needle的发生。 换句话说,它只检查haystack是否以needle开始。

原则上,这应该比其他方法具有性能优势:

  • 它不搜索整个haystack
  • 它不会创建新的临时字符串,然后立即丢弃它。

我如何在JavaScript中编写相当于C#的String.StartsWith

var haystack = 'hello world';
var needle = 'he';

//haystack.startsWith(needle) == true

注意:这是一个老问题,正如ECMAScript 2015(ES6)中引入.startsWith方法的评论中指出的那样。 但是,在撰写此更新(2015年)时, 浏览器支持还远未完成


基于这里的答案,这是我现在使用的版本,因为它似乎能够提供基于JSPerf测试的最佳性能(并且功能完备,据我所知)。

if(typeof String.prototype.startsWith != 'function'){
    String.prototype.startsWith = function(str){
        if(str == null) return false;
        var i = str.length;
        if(this.length < i) return false;
        for(--i; (i >= 0) && (this[i] === str[i]); --i) continue;
        return i < 0;
    }
}

这是基于startsWith2从这里: http://jsperf.com/startswith2/6 : http://jsperf.com/startswith2/6 。 我添加了一个微小的性能改进,此后还添加了一个比较字符串为空或未定义的检查,并使用CMS的答案中的技术将其转换为添加到String原型。

请注意,此实现不支持在此Mozilla开发者网络页面中提到的“position”参数,但它似乎不是ECMAScript提案的一部分。


您也可以通过创建您自己的原型/扩展到数组原型,也可以返回以字符串开头的数组的所有成员

Array.prototype.mySearch = function (target) {
    if (typeof String.prototype.startsWith != 'function') {
        String.prototype.startsWith = function (str){
        return this.slice(0, str.length) == str;
      };
    }
    var retValues = [];
    for (var i = 0; i < this.length; i++) {
        if (this[i].startsWith(target)) { retValues.push(this[i]); }
    }
    return retValues;
};

并使用它:

var myArray = ['Hello', 'Helium', 'Hideout', 'Hamster'];
var myResult = myArray.mySearch('Hel');
// result -> Hello, Helium

您可以使用ECMAScript 6的.startsWith方法,但它尚未在所有浏览器中受支持 。 您需要使用填充/填充将其添加到不支持它的浏览器上。 创建符合规范中规定的所有细节的实现有点复杂,并且此答案中定义的版本不会执行; 如果你想要一个忠实的垫片,使用:

一旦你完成了这个方法(或者你只支持已经有的浏览器和JavaScript引擎),你可以像这样使用它:

"Hello World!".startsWith("He"); // true

var haystack = "Hello world";
var prefix = 'orl';
haystack.startsWith(prefix); // false

我只是想补充一下我的看法。

我想我们可以像这样使用:

var haystack = 'hello world';
var needle = 'he';

if (haystack.indexOf(needle) == 0) {
  // Code if string starts with this substring
}

我在寻找性能,所以我通过jsperf运行了这些功能。 我测试了不同大小的主题和搜索字符串的功能,并且似乎所有方法都表现出不同输入的不同性能; 一般模式是性能随着搜索字符串长度的增加而降低。

总体的胜利者原来是这样的子方法。

https://jsperf.com/javascript-string-startswith


最佳方案:

function startsWith(str, word) {
    return str.lastIndexOf(word, 0) === 0;
}

startsWith("aaa", "a")
true
startsWith("aaa", "ab")
false
startsWith("abc", "abc")
true
startsWith("abc", "c")
false
startsWith("abc", "a")
true
startsWith("abc", "ba")
false
startsWith("abc", "ab")
true

如果你也需要这个,

function endsWith(str, word) {
    return str.indexOf(word, str.length - word.length) !== -1;
}

对于那些喜欢将其原型化为String的人:

String.prototype.startsWith || (String.prototype.startsWith = function(word) {
    return this.lastIndexOf(word, 0) === 0;
});

String.prototype.endsWith   || (String.prototype.endsWith = function(word) {
    return this.indexOf(word, this.length - word.length) !== -1;
});

用法:

"abc".startsWith("ab")
true
"c".ensdWith("c") 
true

最好的高性能解决方案是停止使用库调用,并只是认识到你正在使用两个数组。 手执的实现既短又快,比我在这里看到的其他所有解决方案都快。

function startsWith2(str, prefix) {
    if (str.length < prefix.length)
        return false;
    for (var i = prefix.length - 1; (i >= 0) && (str[i] === prefix[i]); --i)
        continue;
    return i < 0;
}

有关性能比较(成功和失败),请参阅http://jsperf.com/startswith2/4 。 (请确保您检查可能违背我的更高版本。)


由于这个过程非常流行,我认为值得指出的是,ECMA 6中有一种实现这种方法的方法,并且为了防止将来出现问题和眼泪,为了准备那个人应该使用'官方'polyfill。

幸运的是,Mozilla的专家为我们提供了一个:

https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith

if (!String.prototype.startsWith) {
    String.prototype.startsWith = function(searchString, position) {
        position = position || 0;
        return this.indexOf(searchString, position) === position;
    };
}

请注意,这具有在过渡到ECMA 6时优雅地忽略的优点。


还请查看underscore.string.js 。 它带有一些有用的字符串测试和操作方法,包括一个startsWith方法。 从文档:

startsWith _.startsWith(string, starts)

该方法检查string是否以starts

_("image.gif").startsWith("image")
=> true

data.substring(0, input.length) === input

var str = 'hol';
var data = 'hola mundo';
if (data.length >= str.length && data.substring(0, str.length) == str)
    return true;
else
    return false;






startswith