【发布时间】:2020-08-11 12:26:05
【问题描述】:
我正在尝试捕获最后一部分是可选的匹配项,但如果存在则应该捕获。但如果使用(...)? 是可选的,则不会被捕获。
例如,使用以下 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+))?/ 使最后一部分可选时,总是捕获第一个匹配项,但数量不是:
$ 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)匹配位置 [0,4) 的 4 个字符,.*?匹配位置 [4,4) 的 0 个字符,(?:number (\d+))?匹配位置 [4,4) 的 0 个字符.