Разбор многострочной строки в JAVA, которая содержит пробелы между

1

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

    PYTHON_HOME    REG_SZ    C:\Python27;C:\Python27\Scripts
    PYTHON_PATH    REG_SZ    C:\tsde\Python\v34
    SCALA_HOME    REG_SZ    C:\Program Files (x86)\scala
    SZ    REG_SZ    C:\Program Files\7-Zip
    TEMP    REG_EXPAND_SZ    %USERPROFILE%\AppData\Local\Temp
    TMP    REG_EXPAND_SZ    %USERPROFILE%\AppData\Local\Temp

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

Key1 = PYTHON_HOME, Value1 = C:\Python27;C:\Python27\Scripts

Key2 = SCALA_HOME, Value2 = C:\Program Files (x86)\scala

Key3 = SZ, Value3 = C:\Program Files\7-Zip

Key4 =TEMP, Value4 = %USERPROFILE%\AppData\Local\Temp

Key5 = TMP, Value5 = %USERPROFILE%\AppData\Local\Temp

До сих пор я играл с шаблоном и матчи в java.util.regex и на самом деле ничего не получил.

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

  • 0
    Не будет что-то вроде String[] parts = input.split(" "); работать лучше?
  • 1
    @MadProgrammer - я думаю, что он должен использовать DOT_ALL с классом Pattern так как его строка многострочная
Показать ещё 1 комментарий
Теги:

2 ответа

1
Лучший ответ
^(.*?)[ ]{4}.*?[ ]{4}(.*)$

Вы можете просто использовать это и захватить захваты или группы.

См. Демонстрацию.

https://regex101.com/r/wX9fR1/26

String line = "test_string";
Pattern pattern = Pattern.compile("^(.*?)[ ]{4}.*?[ ]{4}(.*)$",Pattern.MULTILINE);
Matcher matcher = pattern.matcher(line);
while (matcher.find()) {
    System.out.println("group 1: " + matcher.group(1));
    System.out.println("group 2: " + matcher.group(2));
}
  • 0
    Я хотел бы рассмотреть возможность голосования, если бы у него был пример ...
  • 1
    Поскольку я потратил 10 минут, читая другие учебные пособия и взламывая свое решение, я могу вам сказать, что ссылка не предоставляет информацию, которая понадобится ОП для ее объединения. Да, регулярное выражение работает, но это 10% работы ... Если вы предпочитаете, я мог бы опубликовать свой собственный ответ, с кодом, который у меня работает, используя ваше выражение ...
Показать ещё 9 комментариев
2

Это также будет работать:

public static void main(String[] args) throws IOException {
        String s = "PYTHON_HOME    REG_SZ    C:\\Python27;C:\\Python27\\Scripts\nPYTHON_PATH    REG_SZ    C:\\tsde\\Python\\v34\nSCALA_HOME    REG_SZ    C:\\Program Files (x86)\\scala\nSZ    REG_SZ    C:\\Program Files\\7-Zip\nTEMP    REG_EXPAND_SZ    %USERPROFILE%\\AppData\\Local\\Temp\nTMP    REG_EXPAND_SZ    %USERPROFILE%\\AppData\\Local\\Temp";
        System.out.println(s);
        Pattern p = Pattern.compile("(?<=\\n|^)(.*?)\\s+(.*?)\\s+(.*?)(?=\\n+|$)",
                Pattern.DOTALL);
        Matcher m = p.matcher(s);
        List<List<String>> list = new ArrayList<List<String>>();
        while (m.find()) {
            List<String> temp = new ArrayList<String>();
            temp.add(m.group(1));
            temp.add(m.group(2));
            temp.add(m.group(3));
            list.add(temp);
        }

        for (List<String> ll : list) {
            System.out.println("1 : " + ll.get(0));
            System.out.println("2 : " + ll.get(1));
            System.out.println("3 : " + ll.get(2));
        }
    }

O/P:

PYTHON_HOME    REG_SZ    C:\Python27;C:\Python27\Scripts
PYTHON_PATH    REG_SZ    C:\tsde\Python\v34
SCALA_HOME    REG_SZ    C:\Program Files (x86)\scala
SZ    REG_SZ    C:\Program Files\7-Zip
TEMP    REG_EXPAND_SZ    %USERPROFILE%\AppData\Local\Temp
TMP    REG_EXPAND_SZ    %USERPROFILE%\AppData\Local\Temp
1 : PYTHON_HOME
2 : REG_SZ
3 : C:\Python27;C:\Python27\Scripts
1 : PYTHON_PATH
2 : REG_SZ
3 : C:\tsde\Python\v34
1 : SCALA_HOME
2 : REG_SZ
3 : C:\Program Files (x86)\scala
1 : SZ
2 : REG_SZ
3 : C:\Program Files\7-Zip
1 : TEMP
2 : REG_EXPAND_SZ
3 : %USERPROFILE%\AppData\Local\Temp
1 : TMP
2 : REG_EXPAND_SZ
3 : %USERPROFILE%\AppData\Local\Temp
  • 0
    Кажется, это предполагает, что String является одной строкой, что произойдет, если она разделена новыми строками?
  • 0
    @MadProgrammer - я добавил \ n, чтобы сделать его многострочным (в linux: должен использоваться P в windows \ r \ n). Проверьте мои строки s
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню