检查字符串是不是以某些东西开头? [复制]

Posted

技术标签:

【中文标题】检查字符串是不是以某些东西开头? [复制]【英文标题】:Check if string begins with something? [duplicate]检查字符串是否以某些东西开头? [复制] 【发布时间】:2010-12-18 13:02:42 【问题描述】:

我知道我可以像 ^= 一样查看 id 是否以某些东西开头,我尝试使用它来做这个,但它没有用。基本上,我正在检索一个 URL,并且我想为以某种方式开始的路径名称的元素设置一个类。

例子:

var pathname = window.location.pathname;  //gives me /sub/1/train/yonks/459087

我想确保对于以/sub/1 开头的每个路径,我都可以为元素设置一个类:

if (pathname ^= '/sub/1')   //this didn't work... 
        ... 

【问题讨论】:

/^\/sub\/1.*$/gi.test(pathname) 将返回一个布尔值作为谓词。 如果您在 6 年后(作为我自己)来到这里,original & duplicated post javascript StartsWith 提供了一个非常简洁的答案,使用 Ecmascript 6 startWith() 函数,这似乎具有最佳性能。 或者从一个非常详细的讨论中详细阐述'回合性能和Thou shall not modify Objects not owned! - 可能是这样的? if (pathname.indexOf('/sub/1') === 0) //Do. 【参考方案1】:

使用stringObject.substring

if (pathname.substring(0, 6) == "/sub/1") 
    // ...

【讨论】:

-1:创建一个额外的冗余字符串。 这是一个测试用例:jsperf.com/starts-with/2。子字符串方法似乎是我机器上最快的(使用 V8)。 这可以更通用,如下所示:var x = "/sub/1"; if (pathname.substring(0, x.length) === x) // ... ;。这样您就不再需要知道x 的长度,因为它可能会发生变化。 创建一个新字符串,所以不太理想,最好的方法可能是使用charAt,如果charAt本身没有创建一个新字符串:) 我会说值得注意的是它正在创建一个字符串,但我认为不值得投票,因为没有大量明显更好的选择,我敢打赌,在大多数情况下在这种情况下,冗余字符串的创建不会是一个值得担心的问题。【参考方案2】:
String.prototype.startsWith = function(needle)

    return this.indexOf(needle) === 0;
;

【讨论】:

-1 在这里查看 cmets 有正当理由不使用这种类型的实现:***.com/a/1978419/560287 这是一个完美的答案(indexOf 事物),而不是被标记为答案的那个。 false的情况下,这个函数的性能取决于你要检查的字符串的长度,这不是这个用例的预期行为 在我看来,这不是唯一正确的答案,而是在内存使用和速度方面最正确的答案。而且它也是可读的,但请记住不要修改您不拥有的对象(或者只是尽量避免它)。 这是一种缓慢的方法,比较将在整个字符串中继续进行,如果这种方法被大量调用,我不会使用它。【参考方案3】:

您也可以为此使用string.match() 和正则表达式:

if(pathname.match(/^\/sub\/1/))  // you need to escape the slashes

string.match() 如果找到则返回匹配子串的数组,否则返回null

【讨论】:

有没有办法在expr中动态插入一个url字符串?例如转义 url 中的 /? @Tjorriemorrie 您可以使用 RegEx 类来完成此操作,例如 var reUrlTester = new RegEx(your_url_string); if(reUrlTester.test(url)) // 使用测试函数查看 url 是否匹配。 @Cros Err,你打错了,这个类实际上是“RegExp”,所以应该是:var matcher = new RegExp(expected);if(matcher.test(actual)) return true 虽然这可行,但如果不是绝对必要,请尽量避免使用 RegEx。 RegEx 函数比其等效的文字字符串函数慢,这只是一个显而易见的事实。事实上,一些官方文档网站实际上会告诉您尽可能避免使用它(例如,我认为 php.net 会这样做),速度要慢得多。我推荐 indexOf() 或 substr() 解决方案。 match 返回一个包含匹配字符串的数组,而不是匹配的字符串。见developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…【参考方案4】:

更多可重用的功能:

beginsWith = function(needle, haystack)
    return (haystack.substr(0, needle.length) == needle);

【讨论】:

【参考方案5】:

首先,让我们扩展字符串对象。感谢 Ricardo Peres 的原型,我认为使用变量 'string' 比使用 'needle' 在提高可读性方面效果更好。

String.prototype.beginsWith = function (string) 
    return(this.indexOf(string) === 0);
;

然后你像这样使用它。警告!使代码具有极强的可读性。

var pathname = window.location.pathname;
if (pathname.beginsWith('/sub/1')) 
    // Do stuff here

【讨论】:

没有真正添加任何东西。 恕我直言 indexOf 如果在开头没有找到立即匹配的字符串,则搜索整个字符串:因此对于很长的字符串进行搜索,效率会越来越低。【参考方案6】:

看看 JavaScript substring() 方法。

【讨论】:

以上是关于检查字符串是不是以某些东西开头? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何检查变量是不是以特定字符串开头? [复制]

在 Bash 中,如何检查字符串是不是以某个值开头?

如何检查某些字符是不是在字符串中? [复制]

如何检查字符串是不是以回文开头?

检查字符串是不是相等,以 r 开头以 match 结尾

检查字符串是不是以 XXXX 开头