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

* - это жадный квантификатор. Это означает, что он соответствует максимально возможному, т.е. Тому, что вы видите. В зависимости от конкретной языковой поддержки для регулярного выражения вам нужно будет найти нежирный квантификатор. Обычно это вопросительный знак, как это: *?. Это означает, что он перестанет потреблять буквы, как только остальное регулярное выражение может быть удовлетворено.

Здесь есть хорошее объяснение жадности.