Я пытаюсь сделать регулярное выражение, которое разбирает следующую структуру, как пример ввода:Trouble сокращается мое регулярное выражение, чтобы найти определенные группы
вставки {вина: Chateau Ste, год: 1997, происхождения: Франция, стоимость: 500,00, qtt: 3}
я смог достичь этого остроумия следующий код:
String line = "insert {wine: Chateau Ste, year: 1997, origin: France, value: 500.00, qtd: 3}";
String pattern = "(^[a-zA-Z]+) \\{(\\w+): (.+), (\\w+): (.+), (\\w+): (.+), (\\w+): (.+), (\\w+): (.+)}";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(line);
if (m.find()) {
System.out.println("Found value: " + m.group(0));
System.out.println("Found value: " + m.group(1));
System.out.println("Found value: " + m.group(2));
System.out.println("Found value: " + m.group(3));
System.out.println("Found value: " + m.group(4));
System.out.println("Found value: " + m.group(5));
System.out.println("Found value: " + m.group(6));
System.out.println("Found value: " + m.group(7));
System.out.println("Found value: " + m.group(8));
System.out.println("Found value: " + m.group(9));
} else {
System.out.println("NO MATCH");
}
Как выход, я получаю:
Found value: insert {wine: Chateau Ste, year: 1997, origin: France, value: 500.00, qtd: 3}
Found value: insert
Found value: wine
Found value: Chateau Ste
Found value: year
Found value: 1997
Found value: origin
Found value: France
Found value: value
Found value: 500.00
Однако этот шаблон кажется чересчур повторяющимся и громоздким. Как я могу сделать его более компактным?
Я попробовал следующее:
String pattern = "(^[a-zA-Z]+) \\{(([a-zA-Z]+): (.+),){3}(\\w+): (.+)}";
, но это дает мне странные результаты и исключение в конце:
Found value: insert {wine: Chateau Ste, year: 1997, origin: France, value: 500.00, qtd: 3}
Found value: insert
Found value: value: 500.00,
Found value: value
Found value: 500.00
Found value: qtd
Found value: 3
Exception in thread "main" java.lang.IndexOutOfBoundsException: No group 7
at java.util.regex.Matcher.group(Unknown Source)
at testes.Teste.main(Teste.java:33)
Вы хотите просто разделить слова? –
Ну, в принципе, да, следуя этой структуре. Мне интересно получить вывод, который я получаю с рабочим регулярным выражением. Как вы думаете, было бы проще, если бы не использовать регулярное выражение? Я хотел бы сделать ошибку, если вход не соответствует данной структуре примера, поэтому я пошел с регулярным выражением. – user2018675
, если значения не содержат, и: просто замените их пробелом и разделите на \\ s +, должно работать –