Perl regex: 为什么没有捕捉到可选的部分?

问题描述 投票:0回答:1

我试图捕捉最后一个部分是可选的,但如果存在的话应该被捕捉的匹配。但是,如果它是可选的,那么使用 (...)?,它没有被捕获。

例如,这2行。

some text and number 18
some other text

我想总是捕捉 "一些",如果我看到 "18号 "就捕捉 "18"。

使用 /(some).*?(?:number (\d+))/当然,对第一行有效,但对第二行无效。

$ echo "some text and number 18" | perl -nle '/(some).*?(?:number (\d+))/ && print join("\n", $1, $2)'
some
18
$ echo "some other text" | perl -nle '/(some).*?(?:number (\d+))/ && print join("\n", $1, $2)'
$

但是当使用 /(some).*?(?:number (\d+))?/ 使最后一个部分成为可选部分,第1个匹配总是被捕获,但数字不是。

$ echo "some text and number 18" | perl -nle '/(some).*?(?:number (\d+))?/ && print join("\n", $1, $2)'
some

$ echo "some other text" | perl -nle '/(some).*?(?:number (\d+))?/ && print join("\n", $1, $2)'
some

$ 

我怎样才能捕捉到可选的部分?

regex perl
1个回答
2
投票

您可以使用

/(some)(?:.*?number (\d+))?/

搜索引擎演示. 详情。

  • (some) - 第1组。some
  • (?:.*?number (\d+))? - 一个可选的非捕获组,将至少被尝试一次,并将尝试匹配1或0次出现的。
    • .*? - 除换行符外的任何0+字符,尽量少用
    • number - a number 绳子
    • (\d+) - 第2组:1+数字

请看 在线演示:

perl -nle '/(some)(?:.*?number (\d+))?/ && print join("\n", $1, $2)' <<< "some text and number 18"
# some
# 18
perl -nle '/(some)(?:.*?number (\d+))?/ && print join("\n", $1, $2)' <<< "some other text"
# some
© www.soinside.com 2019 - 2024. All rights reserved.