【问题标题】:How does .split(/_(.+)?/)[i] work?.split(/_(.+)?/)[i] 是如何工作的?
【发布时间】:2016-07-05 11:29:35
【问题描述】:

发现此解决方案有用后,

split string only on first instance of specified character

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

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

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

在 cmets 中被注意到通过省略问号,?,

split(/_(.+)/)

或省略问号将加号 + 替换为星号 *。

split(/_(.*)/)

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

【问题讨论】:

  • 也许这 - stackoverflow.com/questions/18577704/… - 是一个更好的来源。
  • @WiktorStribiżew 感谢您对这篇文章的关注。请考虑,虽然答案可能与我在这个问题上寻求的答案相对相似,但“为什么在双重匹配正则表达式中捕获组结果”这个问题与我所问的不同。谢谢!
  • 其实有很多这样的问题,就search Google如果你问.*是怎么工作的,你的问题是Learning Regular Expressions的骗子。
  • 我仍然不觉得你分享的冗长答案是我想要的。我正在寻找一个简洁、具体的解决方案来正是我所问的。如果你发现了,请告诉我。谢谢!
  • 我认为您的 exact 问题的答案(.split(/_(.+)?/)[i] 如何工作?)不能简洁.您需要了解该正则表达式的每个组件的作用,并且发生了很多事情。最好问一些 Google 和 SO 可以帮助您理解的组件(例如“什么是正则表达式捕获组”)。

标签: javascript jquery regex


【解决方案1】:
"good_luck_buddy".split(/_(.+)?/)

真的没有多大意义。本质上是一样的

"good_luck_buddy".split(/_(.*)/)

("match 1 or more, optional" 与"match 0 or more"相同).

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>/, '')

【讨论】:

    【解决方案2】:

    我不会解释基本的 RegEx 是如何工作的(“什么是捕获组”......)。但是要回答您的问题“哪个最好以及为什么”:这只是性能问题。不同的正则表达式导致正则表达式处理器中的处理时间不同。

    查看这个 jsperf 比较: http://jsperf.com/regex-split-on-first-occurence-of-char

    我测试了 IE11、FF 和 Chrome。在这种情况下,三个正则表达式变体之间并没有明显的区别。

    【讨论】:

      【解决方案3】:

      不需要正则表达式。只需找到'_'(下划线)的索引并获取子字符串。

      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)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-18
        • 2014-05-13
        • 2017-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-25
        • 1970-01-01
        相关资源
        最近更新 更多