Как сопоставить URL в регулярном выражении PCRE, который не содержит определенного префикса - PullRequest
1 голос
/ 11 апреля 2019

У меня есть список строк, которые мне нужно отфильтровать с помощью регулярных выражений. Некоторые строки могут содержать URL-адреса в форме '(random_chars). (Random_chars). (Random_chars). (Random_chars) ...' и т. Д.

Я пытаюсь создать регулярное выражение, которое найдет такие URL-адреса, но игнорирую URL-адреса, где первый набор (random_chars) не соответствует 'java'.

Например строки ниже:

  • "тестовая строка (test.url.com) abcdef java.lang.Assertion uvwxyz www.google.com abcdef"

    Я ожидаю, что он будет соответствовать test.url.com и www.google.com, но не java.lang.Assertion

  • "другая тестовая строка /abc/xyz/lib/def/GH.tr test 200."

    Я бы не хотел, чтобы он совпадал с GH.tr

Мое текущее регулярное выражение будет соответствовать ниже:

  • test.url.com
  • java.lang.Assertion
  • www.google.com
  • GH.tr

Это мое текущее регулярное выражение, и я попытался использовать отрицательный прогноз:

(?!java)(?:(?:\w+\.)+[\w]+)

Что я пропустил с моим регулярным выражением?

1 Ответ

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

Вы получаете эти совпадения, потому что отрицательный взгляд (?!java) утверждает, что то, что прямо справа, не является java.

Это ложно, когда позиция находится прямо перед java.lang.Assertion, поэтому не совпадает.

Но затем, переходя к j, утверждение верно, потому что справа теперь ava.lang.Assertion, так что будет совпадать.

Одним из вариантов может быть совпадение с тем, что вы не хотите продолжать использовать (*SKIP)(*FAIL). Затем сопоставьте то, что вы хотите сохранить.

\bjava(?:\.\w+)+(*SKIP)(*FAIL)|(?<!/)\b\w+(?:\.\w+)+

Это будет соответствовать

  • \bjava(?:\.\w+)+(*SKIP)(*FAIL) Шаблон, соответствующий тому, что вы не хотите сохранять
  • | или
  • (?<!/) Отрицательный взгляд сзади, утверждаю, что слева не косая черта
  • \b\w+(?:\.\w+)+ Шаблон, которому вы хотите соответствовать, начиная с границы слова

Regex demo | Php demo

...