2013-07-27 3 views
2

Я хочу создать шаблон регулярного выражения, которые могут выбрать {aa=xx bb=yy} или {aa=xx}регулярное выражение шаблон для {аа = хх бб = уу} и {аа = хх}

Это то, что я использую в коде.

Pattern pattern = Pattern.compile("([{])(aa=\\S+)\\s*(bb=\\S+)?([}])"); 
final Matcher matcher = pattern.matcher(str); 

Есть ли лучший способ сделать это?

+0

Что такое 'action' и' data' там? И хотите ли вы сопоставить эти строки или узнать эти шаблоны в большей строке? –

+0

Не совсем, что вы хотите извлечь точно (в порядке)? –

+2

Можете ли вы определить, что именно вы хотите выполнить регулярное выражение? Из вашего описания мои мысли идут примерно так: '{{action = \\ S +) (\\ s (data = \\ S +))?}" ' –

ответ

0

Небольшое усовершенствование: Вы можете оставить вне захвата групп с классами символов с целью экранирования специальных символов: просто использовать \{ вместо ([{]) и \} вместо ([}]).

+0

fyi '{' и '}' не нужно также экранировать. – anubhava

+1

@anubhava. Они делают. –

+2

@anubhava фактически '{' должно быть экранировано, но '}' можно использовать как обычно. – Pshemo

1

Вы можете использовать именованные захваты:

Pattern pattern = Pattern.compile("\\{(?<k1>[^=]+)=(?<v1>[^\\s}]+)(?>\\s+(?<k2>[^=]+)=(?<v2>[^}]+))?}"); 

тогда вы получите ключи и значения в названных группах (k1 k2 v1 v2).

Извещение: помещение пространства в необязательную группу со вторым ключом/значением лучше и избегать теста.

Другим способом, если у вас есть undeterminate количество пар ключей/значений в фигурных скобках:

Pattern pattern = Pattern.compile("(?:\\{|\\G)([^=\\s]+)=([^\\s}]+)(?:\\s*|})"); 

(я предполагаю, что нет пространства вокруг =, вы можете добавить их в случае необходимости)

+0

Второй шаблон кажется подходящим для меня, но он дает ошибку: - java.util.regex.PatternSyntaxException: Синтаксическая ошибка в шаблоне регулярного выражения рядом со индексом 36: 07-27 19: 41: 18.470: E/AndroidRuntime (30582): (? : \ {| \ G) ([^ = \ s] +) = ([^ \ s}] +) (?: \ S * |}) 07-27 19: 41: 18.470: E/AndroidRuntime (30582): ^ – user2465439

Смежные вопросы