2014-08-28 3 views
0

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

Система сохраняет группу захвата 1 в базе данных.

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

Учитывая строку: «Я хочу, чтобы захватить этот бит, но не этот бит и определенно этот бит»

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

([A-Za-z/s]*) but not this bit([A-Za-z/s]*) 

Это дало бы мне два захват группы: Группа 1: «Я хочу, чтобы захватить этот бит» Группа 2: «и, безусловно, этот бит»

Однако, я скучаю на половину моего результата, так как 1-й группе все, что хранится.

+0

Почему бы вам не попробовать это http://regex101.com/r/lD8nJ2/2? –

+0

вам не нужен модификатор 'g', который сообщает регулярному выражению продолжить после первого совпадения, поэтому обычно'/([A-Za-z/s] *), но не этот бит ([A-Za-z/s] *)/g', в зависимости от вашей системы PCRE синтаксис может отличаться. – Tensibai

+0

Один из подходов - сначала проверить, содержит ли вход 'но не этот бит'. Если это произойдет, удалите 'но не этот бит' из ввода и остальной части захваченной группы # 1. – anubhava

ответ

2

Возможно, вы думаете о возможности сброса ветви. Но это только предположение.

(?|([a-zA-Z\s]+) but not this bit|([a-zA-Z\s]+)) 

Как указано в комментариях, вы можете исправить это, используя правильный синтаксис.

([A-Za-z\s]+) but not this bit([A-Za-z\s]+) 
+0

Да, группа сброса-сброса хороша, но это не инструмент для этой работы. Проблема заключалась в том, что вторая группа всегда захватывала пустую строку, и вы решили это, изменив '/ s' на' \ s'. Изменение «*» на «+» было хорошим; вы никогда не должны использовать '*', если вы можете использовать '+' вместо этого. Это просто оставляет вас открытой для плохой работы и бесшумных сбоев. –