Android正则表达式问题以提取数据-日志中的PID

时间:2019-06-03 05:50:08

标签: java android regex

我在Android上是菜鸟,我正在尝试提取Android日志的PID,但是当我尝试使用正则表达式时,请勿将值提取到我的变量中。日志消息的格式为:

E/AndroidRuntime(14700): Process: com.example.log_v_02, PID: 14700

但是有时格式是这样:

E/AndroidRuntime( 4700): Process: com.example.log_v_02, PID: 14700

在第一个“(”之后有一个空格

我正在使用模式和匹配器类来实现,这是我的代码:

Pattern saca_pid = Pattern.compile(".*( [0-9]{1,4}).*||.*([0-9]{5,}).*");
StringBuilder log=new StringBuilder();
String line = "";
while (true) {
    try {
        if (!((line = bufferedReader.readLine()) != null)) break;
    } catch (IOException e) {
        e.printStackTrace();
    }
    Boolean matches = Pattern.matches(patron_malicioso,line);

    Matcher encuentra_pid = saca_pid.matcher(line);
    if(encuentra_pid.find())
    {
        String pid = encuentra_pid.group(1);
    }

}

1 个答案:

答案 0 :(得分:0)

正则表达式的替代是管道,即|不是双管道||,这是逻辑OR。您的代码的确切解决方法是:

Pattern saca_pid = Pattern.compile(".*( [0-9]{1,4}).*|.*([0-9]{5,}).*");

解决此问题可能会使您的代码正常工作,但我建议使用以下模式:

\(\s*(\d+)\):

您更新的代码:

Pattern saca_pid = Pattern.compile("\\(\\s*(\\d+)\\):");
StringBuilder log = new StringBuilder();
String line = "";
while (true) {
    try {
        if (!((line = bufferedReader.readLine()) != null)) break;
    } catch (IOException e) {
        e.printStackTrace();
    }
    Matcher encuentra_pid = saca_pid.matcher(line);
    if (encuentra_pid.find()) {
        String pid = encuentra_pid.group(1);
    }
}

更新后的格式通过将数字前面的前导空格设置为可选,从而完全避免了替换。