2016-08-05 3 views
-3

Скажем, у меня есть строки ниже:Как слить регулярные выражения?

one two three 

Можно ли написать регулярное выражение, которое будет возвращать ниже?

one three 

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

+0

Единственное совпадение, да (как в, один образец), но вам все равно нужны две группы. Вообще говоря, группы захвата захватывают смежные части строки - так как 'one' и' three' НЕ смежны, вам понадобятся две группы захвата. –

+0

Да, но мне было интересно, есть ли какая-нибудь магия регулярных выражений, которая объединит их в одну группу. – Milad

+0

Вы должны сделать это в коде, вне вашего регулярного выражения. Что-то вроде (в Perl, например) '$ string = ~/(один) два (три) /; напечатайте «$ 1 $ 2»; '. –

ответ

1

Проще говоря: нет, это невозможно сделать (как описано в комментариях к исходному вопросу).

Чтобы узнать, почему, давайте посмотрим на это немного более широко. Регулярное выражение может быть смоделировано как (часто сложное) deterministic finite automaton, также известное как DFA, и ваш средний механизм регулярных выражений реализован как один. Это означает, что регулярное выражение будет обрабатывать нуль или один символ за раз, и посмотреть, совпадает ли он с текущим токеном. Если нет, он будет отступать и попытаться сопоставить любой возможный токен на текущем этапе (выполняется с помощью операции чередования |). Если он не удается, он останавливается и сообщает, что он не может совпадать. Поскольку DFA работает на входе в последовательном порядке, то, что вы просите, в принципе невозможно по определению.

Смежные вопросы