将 IP:Port 字符串格式化为

Posted

技术标签:

【中文标题】将 IP:Port 字符串格式化为【英文标题】:Formatting IP:Port string to 【发布时间】:2014-10-15 05:01:13 【问题描述】:

我正在尝试制作一个用于实验的小聊天程序,但由于我不是最好的 Java 程序员,我不知道如何将端口与 IP 分开,因为它们都在同一个字符串中。

这不是很清楚,但这基本上是我想要做的。 用户以 IP:Port 格式输入 IP 和端口 扫描仪抓取它并将其放入字符串中 不知何故,将冒号之前的所有内容放入字符串,将冒号之后的所有数字放入 int。

关于如何做到这一点的任何想法?

【问题讨论】:

如果您可以假设您的输入格式为 IP:Port,您可以使用 String 类的 split() 方法在 : 上进行拆分。这将返回一个包含两个元素的数组,第一个包含 IP,第二个包含端口 我会在谷歌上搜索一下,谢谢 :) 【参考方案1】:

首先,您应该检查String 是否包含冒号。然后,您可以将String.split(String)Integer.parseInt(String) 与类似的东西一起使用

String input = "127.0.0.1:8080"; // <-- an example input
int port = 80; // <-- a default port.
String host = null;
if (input.indexOf(':') > -1)  // <-- does it contain ":"?
  String[] arr = input.split(":");
  host = arr[0];
  try 
    port = Integer.parseInt(arr[1]);
   catch (NumberFormatException e) 
    e.printStackTrace();
  
 else 
  host = input;

System.out.printf("host = %s, port = %d%n", host, port);

输出是

host = 127.0.0.1, port = 8080

【讨论】:

【参考方案2】:
public static void main(String args[])
        String allTogether= "ip:port";
        String[] array;

        if(allTogether.contains(":"))
            array = allTogether.split(":");
            String ip = array[0];
            String port = array[1];

            System.out.println(ip);
            System.out.println(port);
        
    

【讨论】:

【参考方案3】:

要验证 IP:PORT 格式,您可以试试这个:

public class Validator 

    private static final String IP_PORT_PATTERN =
            "^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
                    "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
                    "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
                    "([01]?\\d\\d?|2[0-4]\\d|25[0-5]):" +
                    "([1-9][0-9]0,3|[1-5][0-9]4|6[0-4][0-9]3|65[0-4][0-9]2|655[0-2][0-9]|6553[0-5])$";

    private static final Pattern PATTERN;

    static 
        PATTERN = Pattern.compile(IP_PORT_PATTERN);
    

    public static boolean validate(final String s) 
        return PATTERN.matcher(s).matches();
    


感谢frb 和mkyong :)

并分离ip和端口:

public static void main(String args[]) 
    String s = "127.0.0.1:8080";
    if (validate(s)) 
        String ip = s.substring(0, s.indexOf(':'));
        int port = Integer.parseInt(s.substring(s.indexOf(':') + 1));
        System.out.println(ip);
        System.out.println(port);
     else 
        System.out.println("invalid format");
    

【讨论】:

【参考方案4】:

使用String.split IP = splittedIP[0], Port = splittedIP[1] in String 您将需要Integer.parseInt 来获取端口的整数值

String[] ipSplit = "127.0.0.1:80".split(":");
String ip = ipSplit[0];
int port = Integer.parseInt(ipSplit[1]);

【讨论】:

【参考方案5】:
String s = "127.0.0.1:999";
String[] parts = s.split(":");
String address = parts[0];
int port = Integer.parseInt(parts[1]);

在这种情况下,address 将是 "127.0.0.1"port 将是 int 999

请注意,如果: 之后的字符串部分无法解析为整数,则Integer.parseInt 将抛出NumberFormatException,如"127.0.0.1:blahblah"。同样,如果字符串不包含:,则不会有parts[1]

【讨论】:

【参考方案6】:

您可以在java中使用模式匹配器来获取地址和端口信息,并且您还可以验证输入字符串。

Pattern pattern = Pattern.compile(REGEX_FOR_IPADDRESS_WITH_PORT);
Matcher matcher = pattern.matcher("127.0.0.1:80");
if (matcher.matches()) 
    System.out.printf("host = %s, port = %s%n", matcher.group(1), matcher.group(2));
 else 
    System.out.println("Invalid Ip Address");

您可以使用多个正则表达式来验证 V4 和 V6 地址。 希望这会有所帮助。

【讨论】:

以上是关于将 IP:Port 字符串格式化为的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串号码格式化为美国电话号码格式

将字符串格式化为日期时间

如何将数字格式化为货币字符串

NSNumberFormatter 将浮点字符串格式化为整数

将 Instant 格式化为字符串

如何将 3 位整数格式化为 4 位字符串? [复制]