Регулярно выбирайте только пары Key Value и опускайте некоторые символы - PullRequest
0 голосов
/ 04 ноября 2011

У меня есть эти данные

ReferenceDataLocation = as


##############################################################################
#
#   LicenseKey
#       Address Doctor License
#
##############################################################################
LicenseKey = al

, который я хотел бы захватить только пары ключ-значение, например: ReferenceDataLocation = as и LicenseKey = al

Я написал (?xms)(^[\w]+.*?)(?=^[\w]+|\z) регулярное выражение, которое идеально, за исключением того факта, что оно также захватывает ##### часть, которая не является парой ключ-значение.

Пожалуйста, помогите мне изменить то же регулярное выражение (?xms)(^[\w]+.*?)(?=^[\w]+|\z), чтобы получить только ReferenceDataLocation = as и LicenseKey = al

Примечание: Здесь Вы можете попробовать

Обновление

Я пытался (?xms)(^[\w]+.*?)(?=^[\w^#]+|\z), он работает на сайте , но выдает ошибку в Java

Exception in thread "main" java.util.regex.PatternSyntaxException: Unclosed character class near index 31
(?xms)(^[\w]+.*?)(?=^[\w^#]+|\Z)
                               ^

Обновление Regex, которое работает для меня

(?xms)(^[\w]+.*?)(?=^[\w^\s]+|\z)

1 Ответ

5 голосов
/ 04 ноября 2011

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

# some words here LicenseKey = al

Движок регулярных выражений не может смотреть назад от LicenseKey до конца строки. Это не поддерживается в движке Java для регулярных выражений (неограниченный просмотр).

Но то, что вы опубликовали, похоже, это просто файл свойств. Попробуйте это:

import java.io.FileInputStream;
import java.util.Properties;

public class Main {
    public static void main(String[] args) throws Exception {
        Properties properties = new Properties();
        properties.load(new FileInputStream("test.properties"));
        System.out.println(properties.getProperty("ReferenceDataLocation"));
        System.out.println(properties.getProperty("LicenseKey"));
        System.out.println(properties.getProperty("foo"));
    }
}

, который напечатает:

as
al
null

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

И если вы не знаете ключей заранее, вы можете просто перебрать все записи в вашем файле свойств следующим образом:

for(Map.Entry<Object, Object> entry : properties.entrySet()) {
  System.out.println(entry.getKey() + " :: " + entry.getValue());
}

который печатает:

LicenseKey :: al
ReferenceDataLocation :: as

И есть также Properties#stringPropertyNames(), который возвращает Set<String>, который представляет все ключи в файле свойств (дополнительную информацию см. В документации по API).

См:

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