如何获取具有特定格式的子字符串

时间:2018-08-24 08:05:46

标签: java android

我正在创建一个程序,试图从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),然后保存它?

2 个答案:

答案 0 :(得分:2)

REGEX!

您应该使用正则表达式来匹配您的用例:以下正则表达式将使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
  • 然后\.将与.匹配
  • 然后,将同一模式重复四次以匹配ip地址的所有4个数字。
  • 最后,您有:会与:匹配,后跟[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}");