2015-05-07 3 views
1

Я пытаюсь сделать регулярное выражение, которое разбирает следующую структуру, как пример ввода: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) 
+0

Вы хотите просто разделить слова? –

+0

Ну, в принципе, да, следуя этой структуре. Мне интересно получить вывод, который я получаю с рабочим регулярным выражением. Как вы думаете, было бы проще, если бы не использовать регулярное выражение? Я хотел бы сделать ошибку, если вход не соответствует данной структуре примера, поэтому я пошел с регулярным выражением. – user2018675

+0

, если значения не содержат, и: просто замените их пробелом и разделите на \\ s +, должно работать –

ответ

1

Вы можете сделать что-то вроде этого.

String line = "insert {wine: Chateau Ste, year: 1997, origin: France, value: 500.00, qtd: 3}"; 
line = line.replaceAll("\\{"," ").replaceAll(":", " ").replaceAll(","," ").replaceAll("\\}"," ").trim(); 
for(String s:line.split("\\s+")) 
    System.out.println(s); 
+0

Mm, я думаю, это работает нормально. Однако, с помощью этого метода, есть ли способ проанализировать строку, чтобы убедиться, что пользователь ввел * точный синтаксис * и не забыл, скажем, '' или что-то в этом роде, таким образом, вызывая ошибку? – user2018675

+0

, вы не можете подтвердить свой ввод. Это просто разбить слова. Если вы хотите проверить ввод, возможно, придется написать регулярное выражение –