.split(/ _(。+)?/)[i]是如何工作的?

时间:2016-03-18 16:00:02

标签: javascript jquery regex

找到此解决方案后很有用,

split string only on first instance of specified character

我对这实际上是如何运作感到困惑。一篇最高评论解释说,“为了清楚起见,这个解决方案的工作原因是因为第一个_之后的所有内容都在一个捕获组内匹配,并因此而被添加到令牌列表中。” - @Alan Moore

这对我没有意义;什么是“捕获组”?此外,作者的正面评价解决方案,

"good_luck_buddy".split(/_(.+)?/)[1]
"luck_buddy"

在评论中被注意到通过省略问号来改进方法,?,

split(/_(.+)/)

或省略问号用星号替换加号+。

split(/_(.*)/)

这实际上是最好的解决方案,为什么? 谢谢。

3 个答案:

答案 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)