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