Я не совсем уверен, что вы подразумеваете под вложенными регулярными выражениями. Способ, к которому обычно прибегают к подобным вещам, состоит в том, чтобы осторожно выполнять все понемногу, как лексер. Таким образом, вам не нужно пытаться встроить все в один шаблон.
Вместо использования Matcher.matches()
, вы можете пойти на это с помощью Matcher.lookingat()
, который ищет что-то из текущей начальной точки. Таким образом, вы можете проверить их на одну и ту же позицию.
Подобная тактика включает использование формы с одним аргументом Matcher.find()
, где вы указываете начальную позицию символа в качестве аргумента.
Связанная особенность - это якорь \G
, утверждение нулевой ширины, которое заставляет поиск начинаться именно там, где закончилось последнее совпадение в той же строке. Таким образом, вы сэкономите немного бухгалтерии.
Комбинируя разумное использование методов find(N)
и lookingat()
(плюс start()
), возможно, с утверждением \G
, вы можете создать себе более гибкий и сложный алгоритм обработки, чем это возможно при использовании единственного регулярного выражение одно.
На самом деле гораздо проще использовать структурную логику с обычной Java, управляющей вашими регулярными выражениями для частей, чем пытаться делать все в одном гигантском регулярном выражении. Так гораздо проще разрабатывать, отлаживать и тестировать модули. Регулярные выражения лучше всего работают с кусочками строк, не пытаясь закодировать в них весь алгоритм синтаксического анализа.
Кроме того, в Java вы все равно не сможете этого сделать, поскольку в шаблоне нет поддержки рекурсии. Возможно, это так же хорошо, потому что это побуждает вас переводить управляющие структуры на внешний язык, поскольку вы не всегда можете поместить все, что вам нужно, во внутренний.