1

У меня есть следующий текст ниже. Как мне написать регулярное выражение для захвата всего текста, связанного с REQ_XXX?

Это моё выражение .*(REQ_.*)\| , но он захватывает |3 |4 |5 . Я просто хочу, чтобы это прекратилось после первого | это видит.

4 ответа4

2

Редактировать:

.*(REQ_.*?)\|

Хитрость есть ? говорит предшествующий .* чтобы остановить как можно раньше. Таким образом, первый | что следует, заканчивает сферу действия .* Это именно то, что вы хотите.

Мой старый ответ ниже. Это работает хорошо, но я думаю, что вышесказанное - правильный путь.


Старый ответ:

.* соответствует (почти) всему, включая | , Используйте [^|\n]* чтобы сопоставить все, кроме | и новая строка.

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

\n необходимо, потому что чистый [^|]* может охватывать совпадение по нескольким строкам. Я думаю, ты не хочешь этого.

2

Ты можешь использовать :

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

"|" персонаж будет исключен.

1

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

Здесь вы можете следовать нескольким подходам, вам нужно решить, в зависимости от ваших потребностей, какой вы используете:

  1. приведите положительный список символов в вашем коде:
    .*(REQ_[\w]+)[\s]*\|
    • в этом случае [\w]+ соответствует всем символам слова (буквы, цифры и "_")
    • пробелы перед | не включены в захваченный результат ([\s]* выходит за скобки)
  2. дать отрицательный список символов, где вы хотите, чтобы ваше регулярное выражение остановилось:
    .*(REQ_[^|]+)\|
  3. использовать ленивый матч останавливаться на первой же .*(REQ_.+?)\|
0

Если за REQ_ всегда следуют символы слова, вы можете просто использовать REQ_w+ или, если вы не хотите совпадать с ABCREQ_123 , использовать границу слова: \bREQ_\w+ .

Смотрите в действии

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .