Regex для получения определенных значений из строковых данных - PullRequest
0 голосов
/ 18 мая 2018

При выполнении определенной команды оболочки я получаю следующие выходные данные и сохраняю их в строковой переменной

dat /var/france.log

exit


bluetooth_mac=45h6kuu
franceIP=testMarmiton
build_type=BFD
france_mac=F4:0E:83:35:E8:D1
seloger_mac=F4:0E:83:35:E8:D0
tdVersion=1.2
td_number=45G67j
france_mac=fjdjjjgj
logo_mac=tiuyiiy

logout
Connection to testMarmiton closed.

Disconnected channel and session

Из этого я получаю слишком подробную информацию, как показано ниже, и помещаю значения htese в Map,Как я могу сделать это, используя Java.

bluetooth_mac=45h6kuu
build_type=BFD
tdVersion=1.2
seloger_mac=F4:0E:83:35:E8:D0
france_mac=fjdjjjgj

Map<String, String> details =new HashMap<String,String>();
details.put(bluetooth_mac, 45h6kuu);
details.put(build_type, BFD)
etc
etc

Ответы [ 4 ]

0 голосов
/ 18 мая 2018

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

import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class main {
    public static void main(String[] args) {
        String input = // Your input log
                "dat /var/france.log\n" +
                "\n" +
                "exit\n" +
                "\n" +
                "root@france24:~# \n" +
                "root@france24:~# dat /var/france.log\n" +
                "bluetooth_mac=45h6kuu\n" +
                "franceIP=testMarmiton\n" +
                "build_type=BFD\n" +
                "france_mac=F4:0E:83:35:E8:D1\n" +
                "seloger_mac=F4:0E:83:35:E8:D0\n" +
                "tdVersion=1.2\n" +
                "td_number=45G67j\n" +
                "france_mac=fjdjjjgj\n" +
                "logo_mac=tiuyiiy\n" +
                "root@france24:~# \n" +
                "root@france24:~# exit\n" +
                "logout\n" +
                "Connection to testMarmiton closed.\n" +
                "\n" +
                "Disconnected channel and session"; 


        String[] keys = {
                "bluetooth_mac",
                "build_type",
                "tdVersion",
                "seloger_mac",
                "france_mac"
        };

        HashMap<String, String> map = new HashMap<>();
        for(String key : keys){
            String value = getValueOf(input, key);
            if(value != null)
                map.put(key, value);
        }

        for(String key : keys)
            System.out.println(key + " = " + map.get(key));
    }

    public static String getValueOf(String input, String key){ //returns null if not found
        String result = null;
        Pattern pattern = Pattern.compile(key + "=.*+\\s");
        Matcher matcher = pattern.matcher(input);
        if(matcher.find()) {
            result = matcher.group();
            result = result.substring(result.indexOf('=') + 1, result.length() - 1);
        }
        return result;
    }
}

Вывод (добавьте больше ключей в строку ключей, если вы хотите получить больше значений):

bluetooth_mac = 45h6kuu
build_type = BFD
tdVersion = 1.2
seloger_mac = F4:0E:83:35:E8:D0
france_mac = F4:0E:83:35:E8:D1
0 голосов
/ 18 мая 2018

Вы можете попробовать:

        Pattern re = Pattern.compile("^\\s*(.*)\\s*=(.*)$", Pattern.MULTILINE);
        Matcher matcher = re.matcher(input);
        while (matcher.find()) {
            map.put(matcher.group(1), matcher.group(2));
        }
0 голосов
/ 18 мая 2018

Решение 1

Если вы используете Java 8, вы можете использовать:

String fileName = "shell.txt";
try (Stream<String> stream = Files.lines(Paths.get(fileName))) {

    Map<String, String> result = stream
            .filter(line -> line.matches("\\w+=\\w+"))
            .map(line -> line.split("="))
            .collect(Collectors.toMap(a -> a[0], a -> a[1]));

} catch (IOException e) {
    e.printStackTrace();
}

Выходы

{franceIP=testMarmiton, bluetooth_mac=45h6kuu, logo_mac=tiuyiiy, td_number=45G67j, france_mac=fjdjjjgj, build_type=BFD}

Решение 2

Похоже, что у вас есть несколько строк, которые имеют одно и то же имя, в этом случае я хотел бы сгруппировать по Map<String, List<String>>:

String fileName = "shell.txt";
try (Stream<String> stream = Files.lines(Paths.get(fileName))) {

    Map<String, List<String>> result = stream
            .filter(line -> line.matches("[^=]+=[^=]+")) // filter only the lines which contain one = signe
            .map(line -> line.split("=")) // split with = sign
            .collect(Collectors.groupingBy(e -> e[0], Collectors.mapping(e -> e[1], Collectors.toList())));

    result.forEach((k, v) -> System.out.println(k + " : " + v));
} catch (IOException e) {
    e.printStackTrace();
}

Выходы

franceIP : [testMarmiton]
bluetooth_mac : [45h6kuu]
logo_mac : [tiuyiiy]
td_number : [45G67j]
seloger_mac : [F4:0E:83:35:E8:D0]
france_mac : [F4:0E:83:35:E8:D1, fjdjjjgj]
tdVersion : [1.2]
build_type : [BFD]
0 голосов
/ 18 мая 2018
public static void main(String[] args) {
    String str="abc def \n"
            + "key=123 \n "
            + "pass=456 \n"
            + "not working";

        String[] sarray=str.split("\\r?\\n");
        for (String eachline : sarray) {
            System.out.println("line " +  " : " + eachline);
            if(eachline.contains("="))
            {
                String[] sarray2=eachline.split("=");
                System.out.println("key:" +sarray2[0] +":Value:"+ sarray2[1]);
            }
        }
        System.out.println(""+sarray.length);
}

Используйте разделение ("\ r? \ N") для разделения новой строки.

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