我正在创建一个程序,试图从cmd命令(netstat -na)中获取结果,然后保存IP及其端口。
“ netstat -na”结果是这样的
TCP 0.0.0.0:123 0.0.0.0:456侦听...
我正在使用BufferedReader读取输入流
try{
String cmd = "netstat -na";
Process process = Runtime.getRuntime().exec(cmd);
BufferedReader inputBufferedReader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
BufferedReader errorBufferedReader = new BufferedReader(
new InputStreamReader(process.getErrorStream()));
// Grab the results
String line;
while ((line = inputBufferedReader.readLine()) != null) {
if (line.contains("%s.%s.%s.%s:%s")) {
Log.i(TAG, "yes");
String sub = ...
// what can i do?
}
}
while ((line = errorBufferedReader.readLine()) != null) {
Log.i("TAG", line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
我想检查该行是否包含具有这种格式的子字符串,但是它不起作用。 如何检查该行是否包含这样的子字符串(0.0.0.0:123),然后保存它?
答案 0 :(得分:2)
您应该使用正则表达式来匹配您的用例:以下正则表达式将使IP与末尾的端口相匹配:[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}:[0-9]{1,6}
。
所以现在,如果您考虑整个out模式的整个正则表达式,则将如下所示:
^TCP ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}:[0-9]{1,6}) ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}:[0-9]{1,6}) LISTENING\.\.\.$
我们在这里有什么?这听起来很复杂。
[0-9]{1,3}
将匹配1到3位数字123
\.
将与.
匹配:
会与:
匹配,后跟[0-9]{1,6}
会与1到6个连续数字匹配。TCP
,在结尾添加LISTENING.\.\.\
。^
和$
是锚点,规定要匹配的字符串应以此模式开头和结尾。不应有任何其他字符。现在,如何在Java中执行此操作?
private static final String IP_PATTERN_STRING = "([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}:[0-9]{1,6})";
private static final String NETSTAT_OUTPUT_PATTERN_STRING = "^TCP " + IP_PATTERN_STRING + " " + IP_PATTERN_STRING + " LISTENING\\.\\.\\.$";
private static final Pattern NETSTAT_OUTPUT_PATTERN = Pattern.compile(NETSTAT_OUTPUT_PATTERN_STRING);
public String extractIpAddress(String netstatOut) {
Matcher m = NETSTAT_OUTPUT_PATTERN.matcher(netstatOut);
if(m.matches())
// depending on if you want the first or the second ip
// address of the command, use 1 or 2.
return m.group(1);
return null;
}
答案 1 :(得分:0)
使用正则表达式提取所有出现的模式,例如:
String s = "TCP 0.0.0.0:123 0.0.0.0:456 LISTENING...";
Pattern pattern = Pattern.compile("\d\.\d\.\d\.\d:\d{3}");
Matcher matcher = pattern.matcher(s);
String sub = "";
while (matcher.find()) {
sub = matcher.group(0);
System.out.println(sub);
// your code here
}
上面的代码显示:
0.0.0.0:123
0.0.0.0:456
如果可能发生以下情况:
120.2.55.211:124或120.2.55.211:12然后更改模式:
Pattern pattern = Pattern.compile("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:\\d{1,3}");