Другие ответы хороши, если у вас есть только одна пара |
, но что если у вас есть несколько экземпляров, которые вы хотите сопоставить? Например:
| one | two | three | four | five |
В приведенном выше примере есть пять возможных строк, которые находятся между двумя |
. Любой из приведенных выше ответов будет соответствовать только one
, three
и five
, а не соответствует two
или four
.
В этот момент вы можете задаться вопросом: почему? Ответ прост: движок регулярных выражений не может соответствовать одному и тому же тексту дважды.
Рассмотрим, что происходит, когда он совпадает с | one |
, например: поскольку |
после one
уже сопоставлено, и его нельзя сопоставить снова, оставшийся текст, доступный для сопоставления:
two | three | four | five |
Обратите внимание на отсутствие |
до two
. В этом оставшемся тексте two
явно не соответствует, и поэтому строка | three |
фактически соответствует следующему. То же самое произойдет с four
.
Вам нужен способ проверить наличие |
, но не включить его в матч. Это может быть достигнуто с помощью lookaheads и lookbehinds . Теперь это будет зависеть от вида регулярного выражения, которое вы используете для предоставления этих конструкций, поэтому ваш пробег может варьироваться.
Вот как выглядит позитивный взгляд :
(?<=insert_expression_here)
Он будет пытаться сопоставить любое выражение, которое вы там поместили, заканчивая совпадение точно в текущей позиции в исходном выражении.
A позитивный взгляд делает наоборот:
(?=insert_expression_here)
Он будет пытаться сопоставить любое выражение, которое вы там поместили, начиная с совпадение точно в текущей позиции в исходном выражении.
Зная это, становится ясно, что мы должны проверить |
в начале и в конце матча, используя как обзорную сторону ((?<=\|)
) в начале, так и прогнозную ((?=\|)
) в конец.
Вот как выглядит окончательное выражение:
(?<=\|).*?(?=\|)
Смотрите вживую!
Нет необходимости в захвате: единственный текст, который будет соответствовать - это интересующий вас текст. Также обратите внимание, что мы используем ленивое выражение : в основном, вместо того, чтобы пытаться сопоставить как максимально возможное количество символов (поведение по умолчанию), которое будет соответствовать всей строке, мы хотим, чтобы это совпадало как несколько символов. Это обеспечит отсутствие в вашем совпадении случайных |
символов.
А вот отличный учебник , если вы хотите узнать больше о предвидениях и взглядах. Изучение их не только даст вам больше возможностей при построении регулярных выражений, но также даст вам лучшее представление о том, как работает механизм регулярных выражений.