Regex для пары ключ-значение, включая неэкранированный пробел - PullRequest
5 голосов
/ 19 июля 2011

Мне нужно регулярное выражение для анализа пар ключ-значение из файла свойств, чтобы записать их в базу данных. Приложение написано на Java. Поскольку мне нужно хранить информацию о комментариях и пустых строках, у меня не работает properties.load

Ключ - это все до первого появления неэкранированного пробела или знака равенства (включая экранированные пробелы). Значение это все до конца строки, но также может быть пустым.

Он должен соответствовать следующим случаям:

  • ключ = значение
  • значение ключа
  • ключ = значение значения
  • ключ
  • значение ключа
  • ключ \ ключ \ ключ = значение
  • ключ \ ключ \ значение ключа

Я попробовал следующее регулярное выражение, но оно не правильно разделяет два последних случая:

^(\\\s|[^\s=]+)+[\s|=](.*)?$

За последние два примера, которые я получаю на Rubular:

1. key\
2. key\ key value

вместо

1. key\ key\ key
2. value

Я тоже пробовал это , но у меня тоже не работает

Заранее спасибо за помощь!

Ответы [ 2 ]

2 голосов
/ 19 июля 2011

Вы хотите использовать отрицательный вид сзади (?<!\\\\)\s при проверке своего пространства

^((.*?)((?<!\\\\)\\s|=)(.*?)|(\\w+))$

Разбивка

(.*?)             Match everything non greedy up to the next match
((?<!\\\\)\\s|=)  Match witespace not preceded by \\
(.*?)             Again match everything non greedy up to the next match
|\\w+             Or match strings with no whitespace - this captures case 3 with no value

Каждый случай, проверенный с помощью инструмента здесь http://www.cis.upenn.edu/~matuszek/General/RegexTester/regex-tester.html

0 голосов
/ 19 июля 2011

try (помните, что это обычное регулярное выражение, поэтому вам следует остерегаться экранирования обратной косой черты при записи его в виде строк Java):

^(\\\s|[^\s=])+(.*)$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...