Regex только для первого появления? - PullRequest
10 голосов
/ 15 января 2010

Допустим, у меня есть следующая строка:

это тест ради тестирование. это всего лишь тест. Конец.

и я хочу выбрать this is a test и this is only a test. Что в мире мне нужно делать?

Следующее регулярное выражение, которое я пробовал, дает глупый результат:

this(.*)test (я тоже хотел уловить, что было между ними)

возвращает this is a test for the sake of testing. this is only a test

Кажется, что это, наверное, что-то легкое, что я забываю.

Ответы [ 4 ]

26 голосов
/ 15 января 2010

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

this(.*?)test

Модификатор ? позволяет захватывать как можно меньше символов в матче.

8 голосов
/ 15 января 2010

Andy E и Ipsquiggle имеют правильную идею, но я хочу отметить, что вы можете добавить утверждение границы слова, означающее, что вы не хотите иметь дело со словами, которые имеют «this» или «test» - только слова сами по себе. В Perl и аналогичных программах это делается с помощью маркера "\ b".

На самом деле, this(.*?)test будет соответствовать "чертополоху самое большое", чего вы, вероятно, не хотите.

Шаблон, который вы хотите, выглядит примерно так: \bthis\b(.*?)\btest\b

3 голосов
/ 15 января 2010

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

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

1 голос
/ 11 сентября 2017

Для меня просто удалить / г работал.

См. https://regex101.com/r/EaIykZ/1

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