Как выбрать из `|` в `|`? - PullRequest
       37

Как выбрать из `|` в `|`?

2 голосов
/ 25 апреля 2019

Как выбрать текст от | до |? Например:

I have to select | this part | and not this

Я пробовал с (^|\>|\s)\|(\S+), но таким образом он выбирает только первое слово.

Я должен выбрать все символы между первым | и вторым |. Есть ли у вас какие-либо предложения о том, как мне этого добиться?

Ответы [ 4 ]

3 голосов
/ 25 апреля 2019

Вы можете использовать это регулярное выражение и захватить содержимое из группы 1

\|([^|]*)\|

Здесь | является метасимволом, поэтому его необходимо экранировать.Вы начинаете шаблон, сопоставляя |, затем захватываете любые символы, отличные от | ноль или более раз, и захватываете его в group1, а затем снова соответствует | и получаете содержимое из первого шаблона группировки.

Regex Demo

2 голосов
/ 25 апреля 2019

Попробуйте \|(.*?)\|.Знак вопроса делает это выражение не жадным.

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

Попробуйте использовать это:

\|(.*?[^\|])\|

, который может выбрать все, кроме новой строки и канала (с косой чертой перед ним).

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

Другие ответы хороши, если у вас есть только одна пара |, но что если у вас есть несколько экземпляров, которые вы хотите сопоставить? Например:

| 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)

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

Зная это, становится ясно, что мы должны проверить | в начале и в конце матча, используя как обзорную сторону ((?<=\|)) в начале, так и прогнозную ((?=\|)) в конец.

Вот как выглядит окончательное выражение:

(?<=\|).*?(?=\|)

Смотрите вживую!

Нет необходимости в захвате: единственный текст, который будет соответствовать - это интересующий вас текст. Также обратите внимание, что мы используем ленивое выражение : в основном, вместо того, чтобы пытаться сопоставить как максимально возможное количество символов (поведение по умолчанию), которое будет соответствовать всей строке, мы хотим, чтобы это совпадало как несколько символов. Это обеспечит отсутствие в вашем совпадении случайных | символов.

А вот отличный учебник , если вы хотите узнать больше о предвидениях и взглядах. Изучение их не только даст вам больше возможностей при построении регулярных выражений, но также даст вам лучшее представление о том, как работает механизм регулярных выражений.

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