有没有人有一个方便的正则表达式,可以匹配任何合法的DNS主机名或IP地址?
编写一个可以在95%的时间内工作的一个很容易,但是我希望得到一些经过充分测试的东西,以完全匹配最新的RFC主机名规范.
关于:使用Python在文本中查找超链接(与twitter相关)
如何只提取网址,以便将其放入列表/数组?
让我澄清一下,我不想将URL解析成碎片.我想从字符串的文本中提取URL以将其放入数组中.谢谢!
我正在使用以下正则表达式验证URL.我也想验证google.com,但它返回false.可以在下面的RE中更改以验证google.com.
console.log(learnRegExp('http://www.google-com.123')); // false
console.log(learnRegExp('https://www.google-com.com')); // true
console.log(learnRegExp('http://google-com.com')); // true
console.log(learnRegExp('http://google.com')); //true
console.log(learnRegExp('google.com')); //false
function learnRegExp(){
return /^(ftp|https?):\/\/+(www\.)?[a-z0-9\-\.]{3,}\.[a-z]{3}$/.test(learnRegExp.arguments[0]);
}
Run Code Online (Sandbox Code Playgroud) 如何解析文本并查找带字符串的所有超链接实例?超链接不是html格式,<a href="http://test.com">test</a>只是http://test.com
其次,我想转换原始字符串并将所有超链接实例替换为可点击的html超链接.
我在这个帖子中找到了一个例子:
但无法在python中重现它:(
乍一看,我承认这个问题看起来像是这个问题的副本以及与之相关的任何其他问题:
事实上,这个问题的答案几乎可以回答我的问题,但并不完全.
我遇到的问题代码,但最成功的代码如下所示:
private string RemoveIPv6(string sInput)
{
string pattern = @"(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))";
//That is one looooong regex! From: https://stackoverflow.com/a/17871737/3472690
//if (IsCompressedIPv6(sInput))
// sInput = UncompressIPv6(sInput);
string output = Regex.Replace(sInput, pattern, "");
if (output.Contains("Addresses"))
output = output.Substring(0, "Addresses: ".Length);
return output;
}
Run Code Online (Sandbox Code Playgroud)
我在答案中提供的正则表达式模式的问题,David M. Syzdek的答案,是它不匹配并删除我正在抛出的IPv6地址的完整形式.
我正在使用正则表达式模式主要用空格或空值替换字符串中的IPv6地址.
例如,
Addresses: 2404:6800:4003:c02::8a
Run Code Online (Sandbox Code Playgroud)
以及...
Addresses: 2404:6800:4003:804::200e
Run Code Online (Sandbox Code Playgroud)
最后......
Addresses: 2001:4998:c:a06::2:4008
Run Code Online (Sandbox Code Playgroud)
所有这些都没有被正则表达式完全匹配,或者未能完全匹配.
正则表达式将返回字符串的其余部分,如下所示:
Addresses: 8a
Addresses: 200e
Addresses: 2:4008
Run Code Online (Sandbox Code Playgroud)
可以看出,由于残余物所采用的格式不同,它已经留下了难以检测和删除的IPv6地址的残余.下面是正则表达式模式本身,以便更好地分析:
(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))
Run Code Online (Sandbox Code Playgroud)
因此,我的问题是,如何更正此正则表达式模式以便它可以匹配,从而允许从不仅仅包含IPv6地址本身的字符串中完全删除任何IPv6地址?
或者,如何更正上面提供的代码段以提供所需的结果?
对于那些可能想知道的人,我从nslookup命令的StandardOutput获取字符串,并且IPv6地址将始终不同.对于上面的示例,我从"google.com"和"yahoo.com"获得了这些IPv6地址.
我没有使用内置函数来解析DNS条目是有充分理由的,我认为暂时不重要,因此我使用的是nslookup.
至于调用该函数的代码,如果需要,如下所示:(它本身也是另一个函数/方法,或者说是其中一部分)
string output = ""; …Run Code Online (Sandbox Code Playgroud) 寻找一个字符串传递给String#matches(String),它将匹配IPv4,另一个匹配IPv6.
继本文之后,我有兴趣搜索IPv6地址范围.
在IPv4下,我将能够确定ISP提供的起始和结束IP地址,并使用这些整数值作为范围界限,快速搜索数据库以查看数据库中的任何条目是否落入该范围.
这将如何受到IPv6的影响?ISP仍然会像现在这样在范围内拥有IPv6地址吗?如果将IPv6地址存储为SQL Server数据库中的两个bigint,您将如何有效地搜索这些范围?
我知道IPv4和IPv6的验证格式.但不确定如何将它们组合在一起,因此至少有一种格式应该是真的.这是我的验证
validates :src_ip_addr, :presence => true, :uniqueness => true,
:format => { :with => Resolv::IPv4::Regex, :message => "Not an valid IPv4 format"}
validates :src_ip_addr, :presence => true, :uniqueness => true,
:format => { :with => Resolv::IPv6::Regex, :message => "Not an valid IPv6 format"}
Run Code Online (Sandbox Code Playgroud)
如何将它们组合起来如果一种格式正确则验证应该有效.仅当ipv4和ipv6格式不正确时才会失败.
谢谢.
我正在寻找在Spring roo项目中验证IP地址的可能性.
我的实体看起来像这样
package com.ip.test.domain;
import javax.persistence.ManyToOne;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.springframework.roo.addon.javabean.RooJavaBean;
import org.springframework.roo.addon.jpa.activerecord.RooJpaActiveRecord;
import org.springframework.roo.addon.tostring.RooToString;
@RooJavaBean
@RooToString
@RooJpaActiveRecord
public class IP {
@NotNull
@Size(min = 7, max = 15)
private String ip;
@ManyToOne
private Hoster Hoster;
}
Run Code Online (Sandbox Code Playgroud)
使用此设置,仅当字符串包含7到15个字符时才会进行验证,但如果它是IP地址则不会验证.
就像是
@validIpAddress
private String ip;
Run Code Online (Sandbox Code Playgroud)
会好的.
知道这是否可能?
我想有一个函数,我可以传递一个空白修剪字符串,它将返回
0表示错误(不是字符串)1表示ipv4 2表示ipv6 3表示字符串不是ip.
Ipv6有这些规则:
Ipv6由8组由冒号(:)分隔的16位十六进制值表示
.十六进制数字不区分大小写
缩写规则:
1:在16位值中省略前导零
2:用一组或多组连续零替换双结肠
wiki示例显示3种方式都是相同的ipv6:
fe80:0000:0000:0000:0202:b3ff:fe1e:8329
fe80:0:0:0:202:b3ff:fe1e:8329
fe80::202:b3ff:fe1e:8329
Run Code Online (Sandbox Code Playgroud)
我有理由相信ipv4你只需要检查三个.然后检查字符串是否所有
数字和.的计数为数字,最后一个字符串的检查
将在if语句的末尾,所以如果它不是ipv4/6及其字符串则
返回3
我似乎无法找出为什么这个正则表达式不起作用PL/SQL.
if ( REGEXP_LIKE(v,'/^(?>(?>([a-f0-9]{1,4})(?>:(?1)){7}|(?!(?:.*[a-f0-9](?>:|$)){8,})((?1)(?>:(?1)){0,6})?::(?2)?)|(?>(?>(?1)(?>:(?1)){5}:|(?!(?:.*[a-f0-9]:){6,})(?3)?::(?>((?1)(?>:(?1)){0,4}):)?)?(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?>\.(?4)){3}))$/iD') ) then
Run Code Online (Sandbox Code Playgroud)
这是用于验证IPv4和IPv6,它来自这里:https://stackoverflow.com/a/1934546/3112803
不确定这是否与它有关但我也问过这个问题关于最后的D标志:这个正则表达式(RegEx)标志意味着什么/ iD
出于某种原因,这个正则表达式适用于我在本网站上的大部分测试:http://regex101.com/但在PL/SQL一切都无效.
我的意思最的是,有一些情况下,我觉得很失败,但我一直在寻找了几天,这是最好的一个我能找到的是在512个字符(512是限制使用时REGEXP_LIKE的PL/SQL)
我很感激任何帮助.谢谢!
这些是我正在使用的测试用例......
{1: Initial address, regex should say valid/match}
select isValid('2001:0db8:0000:0000:0000:ff00:0042:8329','ipv6') from dual;
{2: After removing all leading zeroes, regex should say valid/match}
select isValid('2001:db8:0:0:0:ff00:42:8329','ipv6') from dual;
{3: After omitting consecutive sections of zeroes, regex should say valid/match}
select isValid('2001:db8::ff00:42:8329','ipv6') from dual;
{4: The loopback address, regex …Run Code Online (Sandbox Code Playgroud) 注意!我不能在我的应用程序中使用filter_var.只有通用功能.也许正则表达式?
<?php
if (is_valid_ipv4($ip)) { ... }
else if (is_valid_ipv6($ip) { ... }
else { ... }
?>
Run Code Online (Sandbox Code Playgroud)