Regex to Split String, следующий за формой ABNF - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть строка, которая следует за определенной грамматикой.

Строка может быть такой:

String query = query1 (param1,param2), query2, query3, query4 (param1);

Нет доступных общих слов. Все запросы / параметры могут быть любыми строками, которые могут содержать символы и цифры.

Нам нужно регулярное выражение, чтобы разделить эту форму таким образом, чтобы она возвращала:

query1 (param1,param2)
query2
query3
query4 (param1)

В настоящее время я использовали это регулярное выражение "\\)," Как: query.split ("\\),");

, поэтому он возвращает следующий результат:

query1 (param1,param2
query2, query3, query4 (param1

Нужно ли исправить это регулярное выражение? Можно ли использовать регулярное выражение для разделения этой формы строки?

1 Ответ

0 голосов
/ 22 апреля 2020

Решение

Вы можете использовать это регулярное выражение для достижения того, что вам нужно:

\s?(.+?)[,;](?![\w,]+?\))

А вот фрагмент кода, который выполняет сопоставление:

String query = "query1 (param1,param2,param3), query2, query3, query4 (param1);";
String pattern = "\\s?(.+?)[,;](?![\\w,]+?\\))";
List<String> list = new ArrayList<String>();

Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(query);

while (m.find()) {
  list.add(m.group(1));
}

System.out.println(list); // [query1 (param1,param2,param3),  query2,  query3,  query4 (param1)]

Объяснение

Мы создаем группу захвата, используя парантез, и говорим ей заканчивать, когда он видит символ , или ;, но только если сразу после него нет ) (это то, что является отрицательным Lookahead предназначен для - (?!\w+?\)))

Мы также хотим удалить начальные пробелы, поэтому мы добавили часть \s? вне группы захвата.

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