RegEx для захвата каждого символа кроме косой черты - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть следующие два примера строк:

"taxonomy": "abc/about_abc/bsc/archive/2009/presentations_dec"

"taxonomy": "about/archive/term"

"taxonomy": "_decommisioned/ntp-server.niehs.nih.gov/htdocs/results_status/resstatf"

Я пробовал со следующим RegEx:

"taxonomy": "(\w+[^\/])\/?"?

Цель состоит в том, чтобы взять каждую из этих строк и разбить их на свои отдельные строки на слеш, так что term1/term2/term3 равно

term1
term2
term3

Я также не знаю, сколько терминов в каждой строке, поэтому они разбиты так, как есть. Это может быть минимум один, максимум 7. Мой RegEx заполнения выглядит так:

(    "taxonomy": "(\w+[^\/])?\/?(\w+[^\/])?\/?(\w+[^\/])?\/?(\w+[^\/])?\/?(\w+[^\/])?\/?(\w+[^\/])?\/?(\w+[^\/])?\/?")

Как мне настроить мою группу захвата, чтобы получить все , кроме прямой косой черты?

1 Ответ

1 голос
/ 14 апреля 2019

Как уже упоминалось в комментариях, в третьей строке эта часть ntp-server.niehs.nih.gov, которая не соответствует \w

Но вы можете упростить выражение, сопоставив не косую черту, используя класс отрицательных символови повторяющийся паттерн, который соответствует прямому слешу, а затем снова 1+ раз, а не прямому слешу.

Тогда вы можете разделить ваш матч по слешу.

Паттерн

"taxonomy": "\K[^/\n]+(?:/[^/\n]+)+(?=")

Объяснение

  • "taxonomy": Совпадение буквально
  • "\K Подберите двойные кавычки и затем забудьте, что было найдено, используя \K
  • [^/\n]+ Совпадение 1+ раз, а не прямая косая черта с использованием отрицательного класса символов
  • (?:/[^/\n]+)+ Повторение шаблона для совпадения /, затем 1+ раз не /
  • (?=") Позитивный взгляд на то, что справа - двойная кавычка

Демонстрация на regex101 | Php demo

Например, если вы используете explode в php:

$pattern = '~"taxonomy": "\K[^/\n]+(?:/[^/\n]+)+(?=")~';

$strings = [
    '"taxonomy": "abc/about_abc/bsc/archive/2009/presentations_dec"',
    '"taxonomy": "about/archive/term"',
    '"taxonomy": "_decommisioned/ntp-server.niehs.nih.gov/htdocs/results_status/resstatf"'
];

foreach ($strings as $string) {
    preg_match($pattern, $string, $match);
    print_r(explode('/', $match[0]));

}

Результат:

Array
(
    [0] => abc
    [1] => about_abc
    [2] => bsc
    [3] => archive
    [4] => 2009
    [5] => presentations_dec
)
Array
(
    [0] => about
    [1] => archive
    [2] => term
)
Array
(
    [0] => _decommisioned
    [1] => ntp-server.niehs.nih.gov
    [2] => htdocs
    [3] => results_status
    [4] => resstatf
)
...