Java: как правильно построить регулярное выражение во время выполнения с переменными аргументами - PullRequest
1 голос
/ 22 января 2012

Каков лучший способ динамически создать регулярное выражение с помощью переменной количества параметров?

например. если мое регулярное выражение имеет форму:

String REGEX = "\\b(?:word1(?:(\\s+)word2(?:(\\s+)word3)?)?)";  

Я хотел бы динамически создать строку регулярного выражения, передавая / заменяя слово X, и я хочу передать переменное число слов, например, только 2 или, возможно, 7.

т.е. в итоге:

REGEX = "\\b(?:cat(?:(\\s+)mouse(?:(\\s+)rain)?)?)";  

в одном вызове, а в другом:

REGEX = "\\b(?:cat(?:(\\s+)mouse(?:(\\s+)rain(?:(\\s+)blue(?:(\\s+)?)?)?)?)?)";  

Ответ, что регулярные выражения не подходят для этих конструкций, может быть принят при условии, что он хорошо поддерживается.

1 Ответ

4 голосов
/ 22 января 2012

Вы можете написать рекурсивную функцию, которая будет генерировать строки регулярных выражений в форме первого примера, который вы дали:

String generateRegex(List<String> words)
{
   if(words.isEmpty()) return "";
   String word = words.remove(0);
   return "\\b(?:" + word + generateInnerRegex(words) + ")";
}

String generateInnerRegex(List<String> words)
{
   if(words.isEmpty()) return "";
   String word = words.remove(0);
   return "(?:(\\s+)" + word + generateInnerRegex(words) + ")?";
}

Вам придется самостоятельно тестировать и отлаживать этот код, но он должен дать вамидея.(Если вы обнаружите ошибки, отредактируйте этот пост для всех, кто придет позже.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...