Замените значение свойства, используя RegEx - PullRequest
0 голосов
/ 17 июня 2009

У меня есть файл config.properties, содержащий свойства в формате свойств Java. Мне нужно заменить значение свойства с известным именем на новое значение. Комментарии и формат файла должны быть сохранены.

Мой текущий подход - использовать RegEx для сопоставления имени свойства, а затем заменить его значение. Тем не менее, Java Properties поддерживает многострочные значения, которые мне сложно сопоставить.

Вот пример. Предположим, что config.properties содержит следующий текст:

# A property
A = 1\
     2

# B property
B = 2

Я хотел бы заменить значение свойства A на «3». Конечный результат должен быть:

# A property
A = 3

# B property
B = 2

Мой текущий RegEx (?s)(A[\\s]*=[\\s]*)(.*) не работает правильно.

Пожалуйста, предложите RegEx или другой способ сделать это.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 17 июня 2009

Попробуйте это:

String regex = "(?m)^(A\\s*+=\\s*+)"
    + "(?:[^\r\n\\\\]++|\\\\(?:\r?\n|\r|.))*+$";

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

Значение состоит из нуля или более любого символа, кроме возврата каретки, перевода строки или обратной косой черты, или обратной косой черты, за которой следует разделитель строк или любой отдельный символ, не являющийся разделителем строк. Разделитель строк может быть любой из трех наиболее распространенных форм: DOS / Windows (\r\n), Unix / Linux / OSX (\n) или Mac OS до * (\r).

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

1 голос
/ 17 июня 2009

В Java есть инструменты для загрузки, чтения, изменения и сохранения файлов свойств.

Лично мне нравится Jakarta Commons Configuration .

0 голосов
/ 17 июня 2009

Я согласен с streetpc в использовании конфигурации Jakarta Commons.

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

Например, в (довольно старом) классе Perl5Util (см. http://jakarta.apache.org/oro/api/org/apache/oro/text/perl/Perl5Util.html), вы можете прочитать, что шаблоны имеют следующий синтаксис:

[m]/pattern/[i][m][s][x]

Префикс m является необязательным, и значение дополнительных опций трейлинга:

i    case insensitive match 
m    treat the input as consisting of multiple lines 
s    treat the input as consisting of a single line 
x    enable extended expression syntax incorporating whitespace and comments
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...