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

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

例如,这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

$ 

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

解决方案:

您可以使用

/(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

给TA打赏
共{{data.count}}人
人已打赏
未分类

试图在C#的WPF中使用selectedChanged在文本框中显示一个组合框元素。

2022-9-13 15:02:19

未分类

如何通过编程强制键盘浮动?

2022-9-13 15:02:21

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索