检查字符串是不是以某些东西开头? [复制]
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()
方法。
【讨论】:
以上是关于检查字符串是不是以某些东西开头? [复制]的主要内容,如果未能解决你的问题,请参考以下文章