Вопрос: regex optional lookahead


Я хочу, чтобы регулярное выражение соответствовало всем этим:

  1. startabcend
  2. startdef
  3. blahstartghiend
  4. blahstartjklendsomething

и вернуться abc, def, ghi а также jkl соответственно.

У меня есть следующее, которое работает для случаев 1 и 3, но у меня возникают проблемы с возможностью просмотра.

(?<=start).*(?=end.*)

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

Хм. Плохой пример. На самом деле бит в середине не является числовым, но предшествует определенному набору символов и, возможно, ему удается. Я обновил входы и выходы по запросу и добавил 4-й пример в ответ на какой-то вопрос.


9


источник


Ответы:


Пытаясь читать между строк, кажется, что, возможно, вы не хотите смотреть сюда, вы действительно хотите не жадных .*?,

(?<=start).*?(?:end)?$

Я предполагаю, что вы пытаетесь сопоставить что-то вроде "start123end", но не хотят, чтобы end или start чтобы отображаться в согласованном тексте, и, таким образом, у вас есть утверждения об отставке, чтобы ограничить .* который обычно жадный.

Вместо этого вы можете использовать нежелательный вариант и привязать правый конец шаблона с помощью $,

(В качестве альтернативы, если вы можете использовать группы захвата, вы должны просто сделать это вместо этого:

start(.*?)(end)?$

а затем просто получите значение из первой группы захвата.)


8



Может быть, вот так:

(?<=start).*?(?=(?:end|$))

Это будет соответствовать «start» и «end» или до конца строки, кроме того, квантификатор должен быть не жадным ( .*?)

Видеть это здесь на Regexr

Выполнил пример в Regexr, чтобы не только работать с цифрами.


7



Сам Lookahead не будет выполнять эту работу. Попробуй это:

(?<=start)(?:(?!end).)*

Сразу же после слова «старт» вы указываете, что остальная часть потребляет все до (но не включая) следующего появления «конца».

Вот демо на Ideone.com


2



Необязательный lookahead не имеет смысла:

Если это необязательно, тогда все в порядке, если оно соответствует, но оно также нормально, если оно не соответствует. И поскольку просмотр не увеличивает совпадение, он абсолютно не влияет.

Таким образом, синтаксис для необязательного lookahead - это пустая строка.


1



если «конец» всегда будет присутствовать, используйте: (?<=start)(.*?)(?=end) как вы положили в OP. Поскольку вы говорите «сделайте смотрище опциональным», тогда просто подбегите, пока не появится «конец» или возврат каретки. (?<=start)(.*?)(?=end|\n), Если вам не нужно захватывать группу «конец», вы можете пропустить просмотр и сделать (?:start)?(.*?)(?:end)? который начнется после «старта», если он там и остановится до «конца», если он есть. Вы также можете использовать больше таких «шаблонов» или «шаблонов»: (?:start|^) а также (?:end|\n),


1



Зачем вам смотреть?

start(\d+)\w*

Посмотрите на Rubular


0