正则表达式从字符串数据中获取特定值

时间:2018-05-18 08:45:54

标签: java regex

执行特定的shell命令时,按照以下方式获取以下输出并将其保存在字符串变量

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 :(得分:1)

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);
}

使用split(&#34; \ r?\ n&#34;)进行新的分割。

答案 1 :(得分:1)

你可以尝试:

        Pattern re = Pattern.compile("^\\s*(.*)\\s*=(.*)$", Pattern.MULTILINE);
        Matcher matcher = re.matcher(input);
        while (matcher.find()) {
            map.put(matcher.group(1), matcher.group(2));
        }

答案 2 :(得分:1)

解决方案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]

答案 3 :(得分:0)

这是一个完整的示例,使用regex-matching提取值并构建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