2013-02-15 2 views
3

У меня есть строка, какВозможно ли это с одним регулярным выражением?

{! texthere } 

Я хочу, чтобы захватить как все после того, как {! пока не закончите или не дойдете до первого}. Так что если у меня есть

{! Текст здесь} {! Текст здесь снова} {! Больше текста здесь. О, парень!

Я хотел бы [ "{! Текст здесь}", "{! Текст здесь}", "{! Больше текста здесь. О мальчик!"]

Я думал, что это будет работать

{!. *} ??

но выше строка будет выходить, чтобы быть [ «{! Текст здесь} {! Текст здесь} {! Больше текста здесь. О мальчик!»]

Я все еще очень неопытный с regexes, поэтому я не понимаю, почему это не работает. Я бы подумал, что это будет соответствовать '{!' за которым следует любое количество символов, пока вы не попадете в скобку (не жадный), которой может не быть.

+0

Самый простой способ адаптировать это - использовать не жадную звезду Клин, обычно представленную как '. *?'. Используете ли вы язык регулярных выражений, который доступен? Не все так делают. – Celada

ответ

2

Вы можете сделать это следующим образом:

({![^}]+}?) 

Regular expression image

Edit live on Debuggex

Затем восстановить группа захвата $1 которая c или соответствует первому набору круглых скобок.

Используя этот способ, вы должны использовать тип «соответствует всем» функции, потому что само регулярное выражение сделано, чтобы соответствовать одной функции групповому

Этот способ не использует какой-либо осмотреться. Также использование ^} должно ограничивать количество циклов цикла regex, так как оно ищет следующий } в качестве выключателя вместо того, чтобы делать все выражение, а затем назад.

+0

Ох это тоже отлично работает. Благодаря! – user1652427

+0

@ user1652427 Разве вы не хотели захватить все после '{!'? –

+1

Из вопроса он также хочет, чтобы разделители: 'Я хотел бы [" {! Text here} "," {! Text here again} "," {! Больше текста здесь. Oh boy! "]' –

2

Я считаю, что вы хотите использовать неохотой квантор:

{!.*?}? 

Это заставит . остановить соответствие как только первый следующий } найден, вместо последнего.

У меня возник вопрос о жадных и неохотных квантификаторах, которые имеют хороший ответ here.

Другим вариантом было бы указать символы, которые позволили прийти между двумя фигурными скобками, как так:

{![^}]*}? 

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

+0

Какой последний '?' Для? – Nolonar

+0

@Nolonar, не уверен фактически. Я просто скопировал регулярное выражение, которое они использовали, и добавил неохотный модификатор к '*'. – jjnguy

+0

В строке примера в моем вопросе я получаю всего 3 матча {! – user1652427

5

Использование positive lookbehind(?<={!)[^}]+:

In [8]: import re 

In [9]: str="{!text here} {!text here again} {!more text here. Oh boy!" 

In [10]: re.findall('(?<={!)[^}]+',str) 
Out[10]: ['text here', 'text here again', 'more text here. Oh boy!'] 

Это является положительным, где по просмотра назад любой не } характер подобран, если следующий {!.

+1

Ahh amazing! В какой-то момент я попытался сделать негативный взгляд, но, я думаю, мне нужно прочесть взгляды и понять их. Это то, что мне нужно. Я отмечу это как ответ, как только мне позволено! – user1652427

1

если ваш инструмент/язык поддерживает PERL регулярное выражение, попробуйте следующее:

(?<={!)[^}]* 
Смежные вопросы