找到此解决方案后很有用,
split string only on first instance of specified character
我对这实际上是如何运作感到困惑。一篇最高评论解释说,“为了清楚起见,这个解决方案的工作原因是因为第一个_之后的所有内容都在一个捕获组内匹配,并因此而被添加到令牌列表中。” - @Alan Moore
这对我没有意义;什么是“捕获组”?此外,作者的正面评价解决方案,
"good_luck_buddy".split(/_(.+)?/)[1]
"luck_buddy"
在评论中被注意到通过省略问号来改进方法,?,
split(/_(.+)/)
或省略问号和用星号替换加号+。
split(/_(.*)/)
这实际上是最好的解决方案,为什么? 谢谢。
答案 0 :(得分:6)
"good_luck_buddy".split(/_(.+)?/)
并没有多大意义。它与
基本相同"good_luck_buddy".split(/_(.*)/)
("匹配1或更多,可选"与&#34相同;匹配0或更多")。
regex.split
在大多数语言中的行为是"取不匹配的字符串":
"a_@b_@c".split(/_@/) => ["a", "b", "c"]
如果拆分表达式包含捕获组(...)
,则这些组也包含在结果列表中:
"a_@b_@c".split(/_(@)/) => ["a", "@", "b", "@", "c"]
所以上面的代码
"good_luck_buddy".split(/_(.*)/)
的工作原理如下:
_(.*)
不匹配的部分。这是good
。_(.*)
的内容。这是_luck_buddy
。由于有一个捕获组,其内容(luck_buddy
)也包含在输出中_(.*)
不匹配的作品。这是一个空字符串,它已添加到输出中,因此输出变为["good", "luck_buddy", ""]
解决"什么是最好的"部分,我使用the second voted solution作为文字分割器:
result = str.slice(str.indexOf('_') + 1)
和.replace
表示正则表达式分割器:
result = str.replace(/.*?<regex>/, '')
答案 1 :(得分:0)
我不打算解释RegEx的基本工作原理(&#34;什么是捕获组&#34; ......)。但要回答你的问题&#34;这是最好的,为什么&#34;:这只是一个表现问题。不同的正则表达式会在正则表达式处理器中产生不同的处理时间。
看到这个jsperf比较: http://jsperf.com/regex-split-on-first-occurence-of-char
我测试了IE11,FF和Chrome。在这种情况下,三种正则表达式变体之间并没有明显的区别。
答案 2 :(得分:0)
无需正则表达式。只需找到'_'
(下划线)的索引并获取子字符串。
function head(str, pattern) {
var index = str.indexOf(pattern);
return index > -1 ? str.substring(0, index) : '';
}
function tail(str, pattern) {
var index = str.indexOf(pattern);
return index > -1 ? str.substr(index + 1) : '';
}
function foot(str, pattern) { // Made this one up...
var index = str.lastIndexOf(pattern);
return index > -1 ? str.substr(index + 1) : '';
}
var str = "good_luck_buddy";
var pattern = '_';
document.body.innerHTML = head(str, pattern) + '<br />';
document.body.innerHTML += tail(str, pattern) + '<br />';
document.body.innerHTML += foot(str, pattern);
如果你想在一个字符串中找到一个模式的索引(正则表达式),这个问题将告诉你如何:
Polyfill for String.prototype.regexIndexOf(regex, startpos)