2013-08-21 107 views
0

我了解Java的基础知识,但我不太用正则表达式或模式的经验,所以请原谅我,如果即时通讯,询问一些超级简单.. 我写检测IP地址和主机名的方法。我使用了这个回答的正则表达式here。我虽然遇到的问题是,如果没有符号的句子都算作主机名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; 
+1

你能举一些例子吗? – prasanth

+1

你能提供几个输入的例子('msg'的一些值)吗? –

+0

示例消息是:您好,请访问我的网站www.google.com。 – Zach

回答

1

说明

没有示例文本和期望的输出,我会尽我所能,回答你的问题。

我会重写你的主机名表述如下:

答:^(?:[a-z][a-z0-9-]*[a-z0-9](?=\.[a-z]|$)\.?)+$将允许像abcdefg

乙单个词的名字:^(?=(?:.*?\.){2})(?:[a-z][a-z0-9-]*[a-z0-9](?=\.[a-z]|$)\.?)+$要求字符串包含至少两个时期像abc.defg.com 。这不会允许一段时间出现在开始或结束或连续的时段。先行{2}内的数字描述了必须出现的点的最小数目。您可以根据需要更改此号码。

enter image description here

  • ^匹配字符串锚开始
  • (?:开始非捕获组提高了性能
  • [a-z][a-z0-9-]*[a-z0-9]匹配文本,从原始表达式采取
  • (?=\.[a-z]|$)向前看如果下一个字符是一个点,后跟一个az字符,或者字符串的末尾为
  • \.?消耗中的一个点,如果它存在
  • )关闭捕捉组
  • +需要捕获组的内容存在的字符串锚的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*
  • 更改了字符类[:]单个字符:
  • 我把捕捉组( ... )成非捕获组(? ... )执行好一点。
+0

这非常有帮助!我唯一可以发现的是正则表达式捕获单数词,例如“hello”,没有特殊的字符。 – Zach

+0

您对主机名有什么要求?它是否应该是一个必须包含句点的FQDN? –

+0

主机名至少应该有“SiteName.com”,但是像www。我也想数一数。是的,只是时期。我不是真的关心ipv6 – Zach