Я склонен согласиться с Rex M, хотя ваше второе требование к числовым ограничениям усложняет ситуацию. Если вы не допустили только самые базовые ограничения, я не знаю способа, чтобы кратко выразить это в регулярном выражении. Если есть такой способ, пожалуйста, не обращайте внимания на остальную часть моего ответа и следуйте другим предложениям здесь. :)
Возможно, вы захотите рассмотреть генератор парсера - такие вещи, как классический lex и yacc. Я не очень знаком с выбором Java, но вот список:
http://java -source.net / с открытым исходным кодом / СА-генераторы
Если вы не знакомы, стандартным подходом было бы сначала создать лексер , который превращает ваши строки в токены. Затем вы передадите эти токены в парсер, который применяет к ним вашу грамматику и выдает какой-то результат.
В вашем случае я предполагаю, что синтаксический анализатор приведет к комбинации регулярного выражения и дополнительных условий. Для вашего примера числового ограничения он может дать вам регулярное выражение \/cal/long/3/4/143:(\d+)\
и ограничение для применения к первой группировке (часть \d+
), которая требует, чтобы число лежало между 100 и 1100. Затем вы примените RE к вашим строкам для кандидатов и примените ограничение к этим кандидатам, чтобы найти совпадения.
Это довольно сложный подход, так что, надеюсь, есть более простой способ. Я надеюсь, что это даст вам некоторые идеи, по крайней мере.