如果一行有特殊前缀,如何忽略正则表达式匹配?

时间:2011-06-10 11:05:07

标签: regex perl if-statement ignore

我在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序列。

如何构建此正则表达式匹配并因行前缀而忽略它?

5 个答案:

答案 0 :(得分:0)

试试这个正则表达式:

/^(?!The text is:).*(?:_?HI2?_?|HI2?_?)/

或使用两个匹配项:

if($subject !~ /^This text is:/i && $subject =~ /_?HI2?_?|HI2?_?/)

答案 1 :(得分:0)

为什么不匹配两次? 如果$ subject不匹配/ ^文本为:/,则运行replace ..

答案 2 :(得分:0)

我刚刚发现了这个精彩资源herePerl部分。

你可以找到一个(*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

否则,您可以使用“负面回顾”。

尝试查看 regex101debuggex

答案 4 :(得分:-1)

/(?<!^The text is.*)(_?HI2?_?|HI2?_?)/