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

Java 如何获取具有特定格式的子字符串,java,android,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); BufferedReade

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

REGEX! 您应该使用正则表达式来匹配您的用例:下面的正则表达式将ip与末尾的端口匹配:
[0-9]{1,3}\[0-9]{1,3}\[0-9]{1,3}\[0-9]{1,3}:[0-9]{1,6}

现在,如果您考虑整个ReX模式的整个输出模式,它将如下:

^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,3}.[0-9]{1,3}.

我们这里有什么?这听起来可能很复杂

  • 例如,
    [0-9]{1,3}
    将匹配1到3个数字
    123
  • 然后
    \。
    将匹配
  • 然后重复相同的模式四次,以匹配ip地址的所有4个数字
  • 最后,您有将匹配的
    ,后面是将匹配1到6个连续数字的
    [0-9]{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;

  }

使用正则表达式提取模式的所有匹配项,如:

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

String.contains接受一个字符串,因此您可以直接检查该字符串是否包含0.0.0.0:123。如果您正在寻找一种特定的格式,那么您应该考虑创建一个正则表达式模式并在contains方法中传递它。像这样的网站帮助:我不是在找0.0.0.0:123,我是在找一个ip格式的子字符串,就像我说的,那么你需要正则表达式。@Serkleant请查看我的答案,这应该会对你有帮助out@TimKranen谢谢你,伙计