为什么替换时1美元是空的?

3 regex perl substitution

我试图将括号内的东西放入img标签中src属性的值:

while(<TOCFILE>)
{
    $toc_line = $_;
    $toc_line =~ s/<inlineFig.*?(\.\.\/pics\/ch09_inline99_*?\.jpg)*?<\/inlineFig>/<img src="${1}" alt="" \/\>/g;
    $new_toc_file .= $toc_line;
}
Run Code Online (Sandbox Code Playgroud)

所以我希望在输出中看到这样的标签:

<img src="../pics/ch09_inline99_00" alt="" />
Run Code Online (Sandbox Code Playgroud)

但相反,我得到:

<img src="" alt="" />
Run Code Online (Sandbox Code Playgroud)

bar*_*art 12

你的正则表达式中有一个错误,因此短语永远不会匹配任何东西:

inline99_*?\.jpg
        ^^^ 
Run Code Online (Sandbox Code Playgroud)

我认为你忘了\d在明星面前,从你想要匹配的示例数据来判断.

你甚至没有要求它会匹配,因为你把它放在*?被捕获的组之后.所以,它只是不匹配任何东西.这就是你得到的:没有.

除了:

($PATTERN)*?
Run Code Online (Sandbox Code Playgroud)

只捕捉它匹配的最后一件事.那也许不是你想要的.例如:

$_ = 'one two three';
s/(\w+\s*)*/$1/;
print;
Run Code Online (Sandbox Code Playgroud)

打印"三".