gpt4 book ai didi

java - IP 和主机名检测

转载 作者:行者123 更新时间:2023-12-02 06:48:09 24 4
gpt4 key购买 nike

我知道java的基础知识,但我对正则表达式或模式不太有经验,所以如果我问一些 super 简单的问题,请原谅我。我正在编写一个检测 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;

最佳答案

描述

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

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

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} 内的数字描述了必须出现的最小点数。您可以根据需要更改此数字。

enter image description here

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

主机名:
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*
  • 将字符类[:]更改为单个字符:
  • 我将捕获组 (...) 转换为非捕获组 (?...) 性能稍好一些。

关于java - IP 和主机名检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18369019/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com