【问题标题】:IP and hostname detectionIP 和主机名检测
【发布时间】:2013-08-21 22:57:30
【问题描述】:

我知道 java 的基础知识,但我对正则表达式或模式没有太多经验,所以如果我问一些超级简单的问题,请见谅。 我正在编写一种检测 IP 地址和主机名的方法。我使用了来自这个答案here 的正则表达式。我遇到的问题是没有符号的句子被算作主机名

这是我的代码:

    Pattern validHostname = Pattern.compile("^(([a-z]|[a-z][a-z0-9-]*[a-z0-9]).)*([a-z]|[a-z][a-z0-9-]*[a-z0-9])$",Pattern.CASE_INSENSITIVE);
    Pattern validIpAddress = Pattern.compile("^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])([:]\\d\\d*\\d*\\d*\\d*)*$",Pattern.CASE_INSENSITIVE);
    String msg = c.getMessage();
    boolean found=false;

    //Randomly picks from a list to replace the detected ip/hostname
    int rand=(int)(Math.random()*whitelisted.size());
    String replace=whitelisted.get(rand);

    Matcher matchIP = validIpAddress.matcher(msg);
    Matcher matchHost = validHostname.matcher(msg);

    while(matchIP.find()){
        if(adreplace)
            msg=msg.replace(matchIP.group(),replace);
        else
            msg=msg.replace(matchIP.group(),"");

        found=true;
        c.setMessage(msg);
    }
    while(matchHost.find()){
        if(adreplace)
            msg=msg.replace(matchHost.group(),replace);
        else
            msg=msg.replace(matchHost.group(),"");

        found=true;
        c.setMessage(msg);
    }
    return c;

【问题讨论】:

  • 你能举个例子吗?
  • 您能否提供几个输入示例(msg 的一些值)?
  • 示例消息是:您好,请访问我的网站 www.google.com。

标签: java regex dns


【解决方案1】:

说明

没有示例文本和所需的输出,我会尽力回答您的问题。

我会像这样重写你的主机名表达式:

答: ^(?:[a-z][a-z0-9-]*[a-z0-9](?=\.[a-z]|$)\.?)+$ 将允许单个单词名称,例如 abcdefg

B: ^(?=(?:.*?\.){2})(?:[a-z][a-z0-9-]*[a-z0-9](?=\.[a-z]|$)\.?)+$ 要求字符串至少包含两个句点,如abc.defg.com。这将不允许句点出现在开头或结尾,或连续的句点。前瞻{2} 中的数字描述了必须出现的最小点数。您可以根据需要更改此数字。

  • ^匹配字符串锚的开始
  • (?:启动非捕获组提高性能
  • [a-z][a-z0-9-]*[a-z0-9] 匹配文本,取自您的原始表达式
  • (?=\.[a-z]|$) 向前看,看看下一个字符是一个点后跟一个 a-z 字符,还是字符串的结尾
  • \.? 使用单个点(如果存在)
  • )关闭捕获组
  • + 要求捕获组的内容存在 1 次或多次
  • $匹配字符串锚的结尾

主机名:
A Allows host name without dots
B Requires host name to have a dot

Live Demo with a sentence with no symbols

我也会重写 IP 表达式

^(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(?::\d*)?$

这里的主要区别在于我:

  • 从末尾删除了多个 \d*,因为表达式 \d*\d*\d*\d*\d*\d* 等价于 \d*
  • 将字符类[:]更改为单个字符:
  • 我将捕获组(...) 转换为非捕获组(?...),效果更好。

【讨论】:

  • 这很有帮助!我唯一能发现的是,正则表达式捕获了单数单词 ex."hello" 没有特殊字符。
  • 您对主机名有什么要求?是否应该是必须包含句点的 FQDN?
  • 主机名至少应包含“SiteName.com”,但应包含 www.我也想数一数。是的,只是时期。我不是很关心 ipv6
猜你喜欢
  • 2019-04-22
  • 2021-01-18
  • 1970-01-01
  • 2022-01-20
  • 2023-04-06
  • 1970-01-01
  • 2020-07-12
  • 2014-12-19
  • 2014-12-02
相关资源
最近更新 更多