Посмотрите за регулярное выражение в однострочном Perl - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь создать однострочный скрипт, который печатается, когда github не позади golang.

Например, java is a language used in github должно совпадать, но golang is a language used in github не должно совпадать.

Я пробовал выражение /(?<!golang).*github/, но оно не работает.

echo "golang is a language used in github" |
    perl -nle'print /(?<!golang).*github/ ? "match" : "no match"'

Это печатает match вместо no match.

Как я могу сделать это, используя "отрицательный взгляд" в Perl?

(Использование Perl v5.28.1)

Ответы [ 3 ]

3 голосов
/ 22 апреля 2019

Ваше выражение соответствует всем строкам со словом "github" в них.Давайте посмотрим, почему:

/(?<!golang).*github/

будет соответствовать до тех пор, пока Perl может настроить .* так, чтобы оно совпадало с количеством символов, достаточным для того, чтобы не встретиться с ситуацией, в которой ему непосредственно предшествует golang.Реггекс, будучи жадным, .* будет совпадать столько, сколько может, при этом оставаясь равным остатку шаблона.

Так что, если ваша строка

golang is a language used in github

Регулярное выражение может соответствоватьприсвоение строки различным частям:

  • (?<!golang) совпадение в начале строки
  • .* получает "golang is a language used in"
  • github получает"github"

Потенциально дорогостоящий способ выполнить то, что вы хотели:

/^(?:(?!golang).)*github/

Он работает, следя за тем, чтобы ни один из символов, предшествующих "github", не начиналсяпоследовательность "golang".

Итак,

echo "java is a language used in github" | perl -ne 'print q!Not golang: !, /^(?:(?!golang).)*github/ ? q!true! : q!false!'

выведет Not golang: true, а

echo "golang is a language used in github" | perl -ne 'print q!Not golang: !, /^(?:(?!golang).)*github/ ? q!true! : q!false!'

выведет Not golang: false.


Другой (менее запутанный) способ - выполнить два последовательных теста:

/^(.*)github/  and  $1 !~ /golang/

Если вы выполняете десятки или сотни тысяч строк, возможно, протестируйте оба способа, чтобы найти более быстрый

0 голосов
/ 22 апреля 2019

улучшение богемного,

/^(?!.*golang.*github).*github/
0 голосов
/ 22 апреля 2019

Просто используйте отрицательный взгляд на якорь, чтобы начать:

^(?!.*golang).*github
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...