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