我在Perl中使用此正则表达式来匹配并替换以下表达式:
_HI2_
_HI_2
HI2_
_HI_2
if ($subject =~ m/_?HI2?_?|HI2?_?/) {
# Successful match
} else {
# Match attempt failed
}
我也想这样做:
The text is: ABCDEMAFGHIJ
这是一个序列HI
但必须忽略,因为如果你向左看,你可以看到这一行以The text is:
开头。
The text is: ABCDEHI2FGHI
如上所述,这里有两个HI
序列。
如何构建此正则表达式匹配并因行前缀而忽略它?
答案 0 :(得分:0)
试试这个正则表达式:
/^(?!The text is:).*(?:_?HI2?_?|HI2?_?)/
或使用两个匹配项:
if($subject !~ /^This text is:/i && $subject =~ /_?HI2?_?|HI2?_?/)
答案 1 :(得分:0)
为什么不匹配两次? 如果$ subject不匹配/ ^文本为:/,则运行replace ..
答案 2 :(得分:0)
你可以找到一个(*SKIP)(*F)
构造的细节,它会让你大吃一惊;你描述的问题是一个单行:
cat > test.txt <<EOF
_HI2_
_HI_2xxxHI_2
The text is: ABCDEMAFGHIJ
HI2_
The text is: ABCDEHI2FGHI
_HI_2
EOF
perl -ne '/^The text is:.*$(*SKIP)(*F)|.+/ && s/_?HI_?2?_?/HAPPY/; print' test.txt
# or
perl -ne 's/(^The text is:.*$)(*SKIP)(*F)|_?HI_?2?_?/HAPPY/g; print' test.txt
我对Perl有了新的爱和尊重; Sed是我的首选,但现在我知道如何在Perl中跳过行(读取:保持不变),我会犹豫不决
答案 3 :(得分:0)
不是最优雅的方法,但易于理解 (TIMTOWTDI :)
volumes:
- ${HOME}/DockerStuff/Projects:/root/Documents/Projects
- ${HOME}/DockerStuff/Downloads:/root/Downloads
否则,您可以使用“负面回顾”。
答案 4 :(得分:-1)
/(?<!^The text is.*)(_?HI2?_?|HI2?_?)/