【问题标题】:What does ?: in a regular expression mean? [duplicate]?: 在正则表达式中是什么意思? [复制]
【发布时间】:2014-12-06 11:44:37
【问题描述】:

请解释这个正则表达式的含义以及该表达式将生成哪些组?

$string =~ m/^(\d*)(?: \D.*?)(\d*)$/

PS:我正在将 Perl 代码重构为 Java。

【问题讨论】:

  • (?:...) 是非捕获组。
  • 123 fdhdhf234 对于此输入,第一个捕获组索引包含 123,第二个捕获组索引包含 234。
  • @AvinashRaj 当我运行此代码时perl -e '$string="123fdhdhf234"; $string =~ m/^(\d*)(?: \D.*?)(\d*)$/; print $1; print $2;' 什么都没有打印出来。
  • 是的,因为前三位数字后面没有空格。此正则表达式 ^(\d*)(?: \D.*?)(\d*)$ 仅当字符串以数字开头,后跟空格或空格时才会匹配。
  • 抱歉打扰了。谢谢@AvinashRaj!

标签: regex perl regex-group


【解决方案1】:

这意味着它没有捕获组。匹配成功后,第一个(\d*)会被$1捕获,第二个会被$2捕获,(?: \D.*?)根本不会被捕获。

$string =~ m/^(\d*)(?: \D.*?)(\d*)$/

来自perldoc perlretut

非捕获分组

需要捆绑一组备选方案的组可能会或可能不会用作捕获组。如果不是,它只会在正则表达式的内部和外部为可用的捕获组值集创建一个多余的添加。用 (?:regexp) 表示的非捕获分组仍然允许将正则表达式视为一个单元,但不要同时建立捕获组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-21
    • 2023-03-10
    • 2014-09-02
    • 2016-06-10
    • 2011-05-21
    • 2012-06-10
    • 1970-01-01
    • 2012-08-03
    相关资源
    最近更新 更多