Regex для фильтрации только строки без пробелов - PullRequest
1 голос
/ 06 апреля 2020

В настоящее время у меня есть следующее регулярное выражение:

(?<=\[)([^\]]+)

Результат выглядит следующим образом:

text* your-name
email* your-email
text your-subject
textarea your-message
submit "Submit"
your-subject
your-name
your-email
your-message

Я хотел бы настроить свое регулярное выражение, чтобы оно отфильтровывало результаты, которые имеют промежуток между ними, так что у меня остались только следующие результаты:

your-subject
your-name
your-email
your-message

Как я могу это сделать? Вот как это выглядит сейчас: https://regex101.com/r/yP3iB0/58

Ответы [ 3 ]

1 голос
/ 07 апреля 2020

Вы можете использовать

(?<=\[)[^]\s]+(?=])

См. регулярное выражение и PHP демо . Обратите внимание, что структура $matches является более чистой без группы захвата в шаблоне, причем весь контекст проверен с использованием непотребляющих обходных путей .

Подробности

  • (?<=\[) - положительный взгляд сзади, требующий [ непосредственно слева от текущего местоположения
  • [^]\s]+ - 1+ символов, отличных от ] (не нужно избегать его поскольку это первый символ в классе символов с отрицанием) и пробел
  • (?=]) - положительный прогноз, требующий ] непосредственно справа от текущего местоположения (] не является особенным вне класс символов).

PHP демо :

$arr = ['[text* your-name]','[email* your-email]','[text your-subject]','[textarea your-message]','[submit "Verzenden"]','[your-subject]','[your-name]','[your-email]','[your-message]'];

foreach ($arr as $s) {
  if (preg_match_all('~(?<=\[)[^]\s]+(?=])~', $s, $matches)) {
    print_r($matches[0]);
  }
}

Вывод:

Array
(
    [0] => your-subject
)
Array
(
    [0] => your-name
)
Array
(
    [0] => your-email
)
Array
(
    [0] => your-message
)
0 голосов
/ 07 апреля 2020

Начиная с текущего шаблона, все, что вам нужно сделать, это исключить пробел или все пустые символы из вашего класса символов и проверить, есть ли после них закрывающая квадратная скобка. Так что (?<=\[)([^]\s]+)(?=]) с результатом во всем матче или в группе захвата (что делает его бесполезным).

Но вы можете написать лучший шаблон, более простой и эффективный: \[([^]\s]+)]. demo

Более просто, потому что, поскольку есть группа захвата, вам не нужно использовать обходные пути для извлечения нужного контента без скобок. Это также короче и проще для понимания.

Более эффективно благодаря двум оптимизациям при запуске:

  • Первое и самое важное: когда шаблон начинается с буквенной строки (открывающая скобка здесь), быстрый алгоритм ищет в строке все позиции, где эта литеральная строка встречается в строке темы, и шаблон будет проверяться только в этих позициях. В противном случае, и это тот случай, когда вы заключаете эту скобку в вид сзади, эта оптимизация при запуске невозможна, и шаблон будет проверяться в каждой позиции в строке объекта.
  • Второй называется авто-possessification . Он автоматически делает квантификатор притяжательным во время компиляции, когда возможные возвраты не изменяют результат. Например, a*b становится a*+b, когда a.*b остается a.*b. В нашем случае, поскольку класс символов [^]\s] исключает закрывающую скобку, [^]\s]+] становится [^]\s]++]. Конкретно, когда вместо закрывающей скобки найден пробел, жадный квантификатор не возвращает символы, чтобы попытаться использовать другие возможности, шаблон завершается неудачно, и механизм регулярных выражений пробует шаблон в следующей позиции. Еще раз, если поставить скобку в заглядывание вперед, эта оптимизация отключится.

Но почему обходы отключают эту оптимизацию? Причина проста: эти оптимизации требуют изучения паттерна, поэтому, чтобы эти анализы были быстрыми, они ограничены простыми случаями. (Обратите внимание, что группа захвата не нарушает автоматическое владение.)


Если вы абсолютно хотите избежать группы захвата, но хотите сохранить эти две оптимизации, ничто не запрещает писать:

\[\K[^]\s]++(?=]) демо

или более веселое:

\[(?=[^]\s]++\K]) демо

Два шаблона начинаются с литерал [ и квантификатор притяжений добавляется вручную.

0 голосов
/ 06 апреля 2020
/^\[\K([^ \]]+)(?=\])/gm

Проверьте этот шаблон регулярных выражений на https://regex101.com/r/yP3iB0/62

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...