0

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

这是我的代码:

    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;
4

1 回答 1

2

描述

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

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

A: ^(?:[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]|$)向前看,看看下一个字符是一个点,后跟一个 az 字符,还是字符串的结尾
  • \.?如果存在,则消耗一个点
  • )关闭捕获组
  • +要求捕获组的内容存在 1 次或多次
  • $匹配字符串锚的结尾

主机名:
A允许主机名不带点
B要求主机名带点

没有符号的句子的现场演示

我还会重写 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*
  • 将字符类更改[:]为单个字符:
  • 我把捕获组(……)变成了非捕获组(?……)表现更好一些。
于 2013-08-22T13:46:49.410 回答