【问题标题】:Use of capture groups in String.split() [duplicate]在 String.split() 中使用捕获组 [重复]
【发布时间】:2014-01-29 00:05:11
【问题描述】:
$ node
> "ababaabab".split(/a{2}/)
[ 'abab', 'bab' ]
> "ababaabab".split(/(a){2}/)
[ 'abab', 'a', 'bab' ]
>

所以,这对我来说没有意义。有人可以解释一下吗?我不明白为什么会出现'a'

注意:我正在尝试匹配双行结尾(可能在 Windows 文件上),所以我在 /(\r?\n){2}/ 上进行拆分。但是我的数组中有无关的'\015\n' 条目(注意\015 == \r)。

为什么会出现这些?

注意:也会影响浏览器中的 JS 引擎,所以这是特定于 JS 而不是节点的。

【问题讨论】:

  • 有趣 - 在 ruby​​ 中也有同样的行为。

标签: javascript regex


【解决方案1】:

在您的第二个结果中,a 出现,因为您已将其包装在捕获组 ()(括号)中。

如果您想包含它,但仍需要条件组,请使用非捕获组:(?:a)。问号冒号可以在任何捕获组内使用,它会从捕获的结果列表中省略。

下面是一个简单的例子:http://regex101.com/r/yM1vM4

【讨论】:

  • 钉子被@remus击中头部,谢谢
  • ====[] |-- 我这样做了 :)
  • 左边的东西是钉子吗?我从没见过方形指甲
  • 不,那是我尽力而为的锤子;)右边是钉子。
  • 啊,这更有意义
【解决方案2】:

根据ECMA

String.prototype.split(分隔符,限制)

如果 separator 是包含捕获括号的正则表达式,则每次 separator 匹配的结果(包括任何 undefined 结果)捕获括号被拼接到输出数组中。

给出的例子是:

"ababaabab".split(/(a){2}/) // [ "abab", "a", "bab" ]

split 出现在 aa 上,但只有 "a" 在捕获组 (a) 中,所以这就是拼接到输出数组中的内容。

更多示例:

"ababaaxaabab".split(/(a){2}/) // ["abab", "a", "x", "a", "bab"]

"ababaaxaabab".split(/(aa)/) // ["abab", "aa", "x", "aa", "bab"]

【讨论】:

    【解决方案3】:

    因为 {2} 在捕获括号之外,我猜它分成 2 个字符,但只捕获第一个。

    如果将 {2} 移到括号内:

    "ababaabab".split(/(a{2})/)
    

    然后你会得到

    ["abab", "aa", "bab"]
    

    如果您不想要'aa',请不要将其分组在括号中。即

    "ababaabab".split(/a{2}/)
    

    给予

    ["abab", "bab"]
    

    【讨论】:

    • () 正在捕获最后一场比赛,而不是第一场比赛......如"ababazbab".split(/(a|z){2}/) => [..., "z", ...]
    【解决方案4】:

    split 不断捕获组。这就是您在结果中看到它的原因。

    查看描述并捕获括号:

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split

    【讨论】:

    • 使用非捕获组? (?:)
    • 是的,那是 d'oh 时刻。
    【解决方案5】:

    在正则表达式中() 表示一个捕获组。要不捕获它,请使用非捕获组(?:)

    【讨论】:

    • 在拆分时我想保留该组仍然没有任何意义。但这没关系。 (?:) 是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多