2016-02-18 2 views
1

Я не новичок в регулярном выражении (или SO), но я не могу найти твердого решения для сопоставления оставшихся пробелов между совпадениями.Regex соответствует совпадению пробелов?

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

Получение котировки легко: (\".+?\"|'.+?') = quoteMatch

но сделать еще одну группу матч, чтобы выбрать все еще нет.

Ближайший я получил quoteMatch+'|(.)'. Это отделит мои группы котировок от всех остальных групп, но это не объединяет группы else.

Попытка quoteMatch+'|(.+)' выбирает все вместе, а quoteMatch+'|(.+?)' возвращает меня назад.

Я предполагаю, что мне нужно найти способ сделать первый матч более жадным, чем второй, но все, что я делаю, чтобы сделать его жадным, заставляет его начинать принимать множественные кавычки и вещи между ними (т. Е. Match = "quote1" things in between "quote2".

Я также посмотрел в использовании функции разделения, но он не возвращает то, что раскол, и это не совсем так красноречиво решения, как я полагаю, должен существовать.

Спасибо за любую помощь .

ответ

1

Переместить спичку для выбора другого символа внутри группы захвата в качестве альтернативы ция:

(\".+?\"|'.+?'|.+?(?=["']|$)) 

Затем вы можете использовать положительный предпросмотр, такие как (?=["']|$) для того, чтобы соответствовать до цитаты или в конце строки.

Live Example

При этом ввод:

перед тем котировки "quote1" в кавычки "quote2" после того, как котировки

вернуться бы:

(before quotes), ("quote1"), (in between quotes), ("quote2"), (after quotes) 

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

((['"]).+?\2|.+?(?=["']|$)) 
+1

Да. Спасибо. Это заняло у меня минуту, чтобы понять, но теперь я понял, это супер рад. Я чувствую, что вещи будут намного менее хорошими, если бы я не просто искал цитаты, и, возможно, можно было бы избежать крошечного количества повторений '? = ['"] ', Но спасибо! –

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