检查字符串是否以某物开头?[复制]

Check if string begins with something? [duplicate]

提问人:n00b0101 提问时间:11/20/2009 最后编辑:informatik01n00b0101 更新时间:10/10/2020 访问量:378471

问:

我知道我可以看看 id 是否以某事开头,我尝试使用它,但它没有用。基本上,我正在检索一个 URL,我想为以某种方式开头的路径名设置一个类。^=

例:

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

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

if (pathname ^= '/sub/1') {  //this didn't work... 
        ... 
JavaScript 字符串 匹配

评论

1赞 Downhillski 6/23/2016
/^\/sub\/1.*$/gi.test(pathname)将返回一个布尔值作为谓词。
7赞 theFreedomBanana 9/22/2016
如果你在 6 年后来到这里(就像我自己一样),原始和重复的帖子 Javascript StartsWith 提供了一个非常简洁的答案,使用 Ecmascript 6 startWith() 函数,似乎具有最好的性能。
1赞 Der Zinger 11/14/2018
或者从非常详细的讨论中详细说明“回合表演和 - 也许是这样的事情?Thou shall not modify Objects not owned!if (pathname.indexOf('/sub/1') === 0) {//Do.}

答:

2赞 Piotr Rochala 11/20/2009 #1

看看 JavaScript substring() 方法。

395赞 Philip Reynolds 11/20/2009 #2

使用 stringObject.substring

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

评论

18赞 user1071136 1/18/2013
-1:创建一个额外的冗余字符串。
9赞 Pijusn 7/21/2013
下面是一个测试用例:jsperf.com/starts-with/2 .子字符串方法似乎是我的机器上最快的方法(使用 V8)。
23赞 7/12/2015
这可以像这样变得更加通用:.这样,您就不再依赖于知道它可能变化的长度。var x = "/sub/1"; if (pathname.substring(0, x.length) === x) { // ... };x
0赞 Martijn Scheffer 7/21/2016
创建一个新字符串,所以它并不理想,最好的方法可能是使用 charAt,如果 charAt 本身没有创建一个新字符串:)
0赞 rooby 6/10/2020
我想说的是,值得注意的是它正在创建一个字符串,但我认为不值得投票,因为没有大量明显更好的替代方案,我敢打赌,在大多数情况下,创建冗余字符串不会是一个值得担心的问题。
88赞 Cros 9/9/2011 #3

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

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

string.match()如果找到,将返回一个匹配子字符串的数组,否则为 null

评论

0赞 Tjorriemorrie 7/11/2013
有没有办法在expr中动态插入url字符串?例如,转义 URL 中的 /?
1赞 Cros 8/5/2013
@Tjorriemorrie 您可以使用 RegEx 类来实现此目的,例如 var reUrlTester = new RegEx(your_url_string);if(reUrlTester.test(url)) { // 使用 test-function 查看 url 是否匹配。
0赞 Kzqai 12/20/2014
@Cros 呃,你在那里打错了字,这个类实际上是“RegExp”,所以应该是:var matcher = new RegExp(expected);if(matcher.test(actual)){ return true }
0赞 Byson 12/22/2014
虽然这可行,但如果不是绝对必要,请尽量避免使用正则表达式。一个显而易见的事实是,正则表达式函数比其等效的文字字符串函数慢。事实上,速度要慢得多,以至于一些官方文档网站实际上会告诉您尽可能避免它(例如,我认为 php.net 确实如此)。我推荐 indexOf() 或 substr() 解决方案。
0赞 Trindaz 1/30/2015
match 返回一个包含匹配字符串的数组,而不是匹配的字符串。查看 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
41赞 RobKohr 1/13/2012 #4

一个可重用的功能:

beginsWith = function(needle, haystack){
    return (haystack.substr(0, needle.length) == needle);
}
192赞 Ricardo Peres 2/24/2012 #5
String.prototype.startsWith = function(needle)
{
    return this.indexOf(needle) === 0;
};

评论

11赞 John Magnolia 3/31/2013
-1 请参阅此处的评论,了解不使用此类实现的正当理由:stackoverflow.com/a/1978419/560287
3赞 Dilhan Jayathilake 8/7/2013
这是完美的答案(indexOf thing),而不是被标记为答案的答案。
15赞 Daniel Alder 12/30/2014
如果是 ,则此函数的性能取决于要检查的字符串的长度,对于此用例来说,这并不是预期的false
1赞 Florian Leitgeb 6/29/2015
在我看来,就内存使用和速度而言,这不是唯一正确的答案,而是最正确的答案。它也是可读的,但请记住不要修改您不拥有的对象(或者只是尽量避免它)。
1赞 Martijn Scheffer 7/21/2016
这是执行此操作的缓慢方法,比较将在整个字符串中继续进行,如果此方法被大量调用,我不会使用它。
26赞 Tim 5/18/2012 #6

首先,让我们扩展字符串对象。感谢 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
}

评论

5赞 ratbum 9/11/2013
没有真正添加任何东西。
0赞 willy wonka 4/8/2017
恕我直言,indexOf 如果在开始时没有找到立即匹配项,则会搜索整个字符串:因此,对于要搜索的很长字符串,它的低效率会增加。