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

8pr*_*ons 1 javascript regex jquery

找到这个解决方案后有用,

仅在指定字符的第一个实例上拆分字符串

我对这实际上是如何工作感到困惑.一个顶部意见解释说,"只要是明确的,此解决方案有效的原因是因为一切_是捕获组中匹配的第一个后,和被添加到这个原因令牌列表." - @Alan Moore

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

"good_luck_buddy".split(/_(.+)?/)[1]
"luck_buddy"
Run Code Online (Sandbox Code Playgroud)

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

split(/_(.+)/)
Run Code Online (Sandbox Code Playgroud)

或省略问号用星号替换加号+,*.

split(/_(.*)/)
Run Code Online (Sandbox Code Playgroud)

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

geo*_*org 6

"good_luck_buddy".split(/_(.+)?/)
Run Code Online (Sandbox Code Playgroud)

没有多大意义.它基本上是一样的

"good_luck_buddy".split(/_(.*)/)
Run Code Online (Sandbox Code Playgroud)

("匹配1或更多,可选"与"匹配0或更多"相同).

regex.split在大多数语言中的行为是"取不匹配的字符串":

"a_@b_@c".split(/_@/) => ["a", "b", "c"]
Run Code Online (Sandbox Code Playgroud)

如果拆分表达式包含捕获组(...),则这些也包含在结果列表中:

"a_@b_@c".split(/_(@)/) => ["a", "@", "b", "@", "c"]
Run Code Online (Sandbox Code Playgroud)

所以上面的代码

"good_luck_buddy".split(/_(.*)/)
Run Code Online (Sandbox Code Playgroud)

工作原理如下:

  • 它找到字符串中第一个不匹配的部分_(.*).这是good.
  • 它发现某一件匹配_(.*).这是_luck_buddy.由于存在捕获组,因此其content(luck_buddy)也包含在输出中
  • 最后,它找到了下一个不匹配的作品_(.*).这是一个空字符串,它被添加到输出中,因此输出变为["good", "luck_buddy", ""]

为了解决"什么是最好的"部分,我将使用第二个投票解决方案为字面分割器:

result = str.slice(str.indexOf('_') + 1)
Run Code Online (Sandbox Code Playgroud)

.replace一个正则表达式分路器:

result = str.replace(/.*?<regex>/, '')
Run Code Online (Sandbox Code Playgroud)