Как игнорировать совпадение с регулярным выражением, если строка имеет специальный префикс? - PullRequest
2 голосов
/ 10 июня 2011

Я использую это регулярное выражение в 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 голосов
/ 11 мая 2018

Попробуйте сказать, что это начало строки с "^", игнорируйте пробелы, если вы считаете, что это необходимо (я всегда стараюсь это делать).Также вы можете пометить конец строки как "$"

if ($subject =~ m/^\s*_?HI2?_?|HI2?_?/) {
    # Successful match
} else {
    # Match attempt failed
}
0 голосов
/ 11 мая 2018

Я только что обнаружил этот блестящий ресурс здесь и раздел Perl .

Вы можете найти там детали (*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, я буду меньше колебаться

0 голосов
/ 10 июня 2011

Попробуйте это регулярное выражение:

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

Или используйте два совпадения, например:

if($subject !~ /^This text is:/i && $subject =~ /_?HI2?_?|HI2?_?/)
0 голосов
/ 10 июня 2011

Почему бы просто не совпадать дважды?Если $ subject не соответствует / ^ Текст: /, запустите замену ..

0 голосов
/ 10 июня 2011

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

...