我在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);
}
}
答案 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);
}
}
更新后的格式通过将数字前面的前导空格设置为可选,从而完全避免了替换。