Регулярное выражение для обработки пар ключ-значение - PullRequest
1 голос
/ 29 ноября 2011

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

KEY/VALUE KEY/VALUE VALUE KEY/VALUE

Ключ может иметь несколько значений, разделенных пробелом.

Я хочу сопоставить значения ключей вместе, поэтому результат в приведенной выше строке будет

VALUE
VALUE VALUE
VALUE

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

[A-Z0-9]+/([A-Z0-9 ]+)(?:(?!^[A-Z0-9]+/))

, но это возвращает

VALUE KEY 

как первый результат.

Ответы [ 3 ]

2 голосов
/ 29 ноября 2011

В своем отрицательном прогнозном утверждении измените + на *; в противном случае вы не препятствуете завершению матча непосредственно перед /, вы только предотвращаете его завершение прямо перед словом, за которым следует /. Кроме того, удалите ^ из вашего отрицательного утверждения; это означает «начало строки», поэтому никогда не будет совпадать в этом контексте. Что оставляет:

[A-Z0-9]+/([A-Z0-9 ]+)(?![A-Z0-9]*/)

(я также отбросил нотацию (?:...), поскольку она не имела никакого эффекта в контексте, где она появилась.)

Тем не менее, несколько более простой для чтения подход может быть следующим:

[A-Z0-9]+/([A-Z0-9 ]+)( |$)

, который требует, чтобы за значением следовал либо пробел (который проглатывается), либо конец строки. Поскольку за ключами следует /, они будут игнорироваться.

1 голос
/ 29 ноября 2011

Почему RegEx?

String input = "key/value key/value1 value2 key/value";

String[] pairs = input.split("/");

for(int i = 0; i < pairs.length; i += 2) {
    String key = pairs[0];
    String value = pairs[1];
    /* (Optionally)
        String[] values = value.split(" ");
    */
}

Однако, если вы настаиваете, то я думаю:

([\w]+)/([\w ]+)(?![\w]*/)

Хороший выбор, оннайдите и запишите ключевую группу и значения в качестве отдельной группы.Это позволяет подчеркивания в именах ключей и значений.Вы также можете добавить дефис к набору, если хотите.

Credit: ruakh за большую часть работы над RegEx.Я проголосовал за его / ее ответ.

0 голосов
/ 29 ноября 2011

Вы бы лучше использовали какой-нибудь разделитель строк (не Java-программист, но в php есть функция explode ()). Сначала разбейте строку на основе пробела на массив элементов ключа / значения, затем выполните цикл по элементам массива и снова разделите их, используя / вместо этого на этот раз

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