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

Из следующей линии текста:

start - before capture text - tocapture - maybe after capture

Я должен достоверно захватить стоимость "текст - tocapture", не таща дополнительное - возможно, после захвата часть.

  • космический космический чертой образец в текст - tocapture может или может не присутствовать. текст - tocapture может также быть отдельным словом или иметь места.
  • , Если - возможно после того, как захват присутствует, это будет всегда начинаться с космического пространства черты, тогда случайный текст.

Я должен текст - tocapture , чтобы быть полностью согласованным, присутствует ли - возможно, после захвата или нет.

Лучшее, которое я придумал:

^start - before capture (.*)( - .*)?$

Проблема, она захватывает все после "текста - tocapture", по-видимому, потому что она также содержит "-". Я попробовал некоторый отрицательный предварительный материал, но никакую удачу. См. продукцию Rubular ниже.

First Attempt

Second Attempt

0
nl ja de
Действительно текст - tocapture всегда содержат точно одну черту? В противном случае, как вы сказали бы различные черты обособленно?
добавлено автор Tim Pietzcker, источник
@Tim, текст - tocapture может содержать космическое пространство черты образца. '-возможно после того, как захват' дополнительный, но если существующий, будет всегда начинаться с космического пространства черты, то некоторая случайная строка. Поэтому моя проблема захватывает текст - tocapture в тех случаях, в которых это содержит космическое пространство черты И '-возможно после того, как захват' присутствует.
добавлено автор Udi Bar-On, источник
... и I' m начинающий думать это без дальнейшей квалификации последней черты, я won' t быть в состоянии отличить его от возможно существующей предыдущей черты.
добавлено автор Udi Bar-On, источник

2 ответы

Это нормально: .* захватывает все, и ваша вторая часть дополнительная.

Ваш .* поэтому захватит текст - tocapture - возможно, после захвата и ничего не оставляют для второй группы. Как квантор ? делает его дополнительным, это совершенно довольно пустой строкой...

Для достоверно захватывают то, что вы хотите, можно использовать это:

^start - before capture ([^-]+-[^-\s]+).*
0
добавлено
Это won' t изменяют что-либо.
добавлено автор Tim Pietzcker, источник
Да, я знаю, я отредактировал
добавлено автор fge, источник
fge, ваше отредактированное выражение doesn' t соответствуют на моей линии текста, ни на альтернативе ("начало - перед текстом захвата - tocapture"), на котором я хочу, чтобы то же самое выражение соответствовало также.
добавлено автор Udi Bar-On, источник

Если я понимаю то, в чем вы нуждаетесь правильно, я думаю, что это должно сделать это:

^start - before capture (.*? - .*?)( - .*)?$

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

1.  text - tocapture
2.  - maybe after capture
0
добавлено
@UdiBar-On я полагаю, что ваш синтаксис неоднозначен в этом случае. Как может я говорить различие между "началом - перед захватом sometext - и захватывать это также!" и "начинают - перед захватом sometext - но не захватывают это!"
добавлено автор femtoRgon, источник
это действительно соответствует, но (и я забыл упоминать это - редактирование вопроса теперь), космический космический чертой образец в , текст - tocapture может не присутствовать. Когда я поместил его в parens с? квантор, ваше выражение захватывает на текст и не текст - tocapture .
добавлено автор Udi Bar-On, источник
Спасибо @femtoArgon, I' ve приходят к тому же самому заключению. Отмечание этого как ответ.
добавлено автор Udi Bar-On, источник