Regex только для первого появления?
Скажем, у меня есть следующая строка:
это испытание ради тестирование. это всего лишь тест. Конец.
и я хочу выбрать this is a test
и this is only a test
. Что мне нужно делать в мире?
Следующее Regex, которое я попробовал, дает результат:
this(.*)test
(Я также хотел захватить то, что было между ним)
возвращает this is a test for the sake of testing. this is only a test
Кажется, что это, наверное, что-то легкое, я забываю.
Ответы
Ответ 1
Регулярное выражение является жадным значением, которое будет захватывать как можно больше символов, которые попадают в соответствие .*
. Чтобы сделать это не жадным, попробуйте:
this(.*?)test
Модификатор ?
сделает его захваченным как можно меньше символов в матче.
Ответ 2
Andy E и Ipsquiggle имеют правильную идею, но я хочу указать, что вы можете добавить утверждение о границе слова, то есть вы не хотите иметь дело со словами, которые имеют "this" или "test" в них - только слова сами по себе. В Perl и аналогичном, что сделано с маркером "\ b".
Как бы то ни было, this(.*?)test
будет соответствовать "thistles are theвейшие", которые вам, вероятно, не нужны.
Образец, который вы хотите, выглядит примерно так: \bthis\b(.*?)\btest\b
Ответ 3
*
- это жадный квантификатор. Это означает, что он соответствует максимально возможному, т.е. Тому, что вы видите. В зависимости от конкретной языковой поддержки для регулярного выражения вам нужно будет найти нежирный квантификатор. Обычно это вопросительный знак, как это: *?
. Это означает, что он перестанет потреблять буквы, как только остальное регулярное выражение может быть удовлетворено.
Здесь есть хорошее объяснение жадности.
Ответ 4
Для меня просто удалите /g.
См. https://regex101.com/r/EaIykZ/1