Javascript多正则表达式模式
我试图排除一些内部IP地址和一些内部IP地址格式,以查看网站中的某些徽标和链接。我有多个IP地址范围示例如下。是否可以使用javascript编写一个可以匹配下面列表中所有IP地址的正则表达式Javascript多正则表达式模式,javascript,regex,Javascript,Regex,我试图排除一些内部IP地址和一些内部IP地址格式,以查看网站中的某些徽标和链接。我有多个IP地址范围示例如下。是否可以使用javascript编写一个可以匹配下面列表中所有IP地址的正则表达式 10.X.X.X 12.122.X.X 12.211.X.X 64.X.X.X 64.23.X.X 74.23.211.92 and 10 more /^X |\d{1,3}\.X |\d{1,3}$/应该这样做。如果实际上不需要匹配X字符,可以使用以下方法: \b(?:\d{1,3}\.){3}\d{
10.X.X.X
12.122.X.X
12.211.X.X
64.X.X.X
64.23.X.X
74.23.211.92
and 10 more
/^X |\d{1,3}\.X |\d{1,3}$/应该这样做。如果实际上不需要匹配X字符,可以使用以下方法:
\b(?:\d{1,3}\.){3}\d{1,3}\b
否则我会使用cebarrett提供的解决方案。你可以在正则表达式中完成,但它不会很漂亮,特别是因为JavaScript甚至不支持详细的正则表达式,这意味着它必须是一行庞大的正则表达式,没有任何注释。此外,正则表达式不适合匹配数字范围。我怀疑有更好的工具来处理这个问题 好的,你提供的样品如下:
var myregexp = /\b(?:74\.23\.211\.92|(?:12\.(?:122|211)|64\.23)\.(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\.(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])|(?:10|64)\.(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\.(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\.(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9]))\b/g;
作为详细可读的正则表达式:
\b # start of number
(?: # Either match...
74\.23\.211\.92 # an explicit address
| # or
(?: # an address that starts with
12\.(?:122|211) # 12.122 or 12.211
| # or
64\.23 # 64.23
)
\. # .
(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\. # followed by 0..255 and a dot
(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9]) # followed by 0..255
| # or
(?:10|64) # match 10 or 64
\. # .
(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\. # followed by 0..255 and a dot
(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\. # followed by 0..255 and a dot
(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9]) # followed by 0..255
)
\b # end of number
引用句点,将X替换为\d+,并使用管道将它们连接在一起:
const allowedIPpatterns = [
"10.X.X.X",
"12.122.X.X",
"12.211.X.X",
"64.X.X.X",
"64.23.X.X",
"74.23.211.92" //, etc.
];
const allowedRegexStr = '^(?:' +
allowedIPpatterns.
join('|').
replace(/\./g, '\\.').
replace(/X/g, '\\d+') +
')$';
const allowedRegexp = new RegExp(allowedRegexStr);
那么你们都准备好了:
'10.1.2.3'.match(allowedRegexp) // => ['10.1.2.3']
'100.1.2.3'.match(allowedRegexp) // => null
工作原理:
首先,我们必须将各个IP模式转换为符合其意图的正则表达式。“12.122.X.X”形式的所有IP的一个正则表达式如下:
^12\.122\.\d+\.\d+$
^表示匹配必须从字符串的开头开始;否则,112.122.X.X IP也将匹配。
12等:数字匹配
\:正则表达式中的句点与任何字符都匹配;我们需要文字句点,所以在前面加一个反斜杠。
\d:[0-9]的简写;匹配任何数字。
+:表示1个或多个-在这种情况下,表示1个或多个数字。
$:与^类似,这意味着匹配必须在字符串末尾结束。
因此,我们将IP模式转换成这样的正则表达式。对于单个模式,可以使用如下代码:
const regexStr = `^` + ipXpattern.
replace(/\./g, '\\.').
replace(/X/g, '\\d+') +
`$`;
(?:\d{1,2}|1\d{2}|2[0-4]\d|25[0-5])
将所有的.s替换为\。和带有\d+的Xs,并将^和$粘在两端
注意双反斜杠;字符串解析和正则表达式解析都使用反斜杠,因此,无论我们希望文本解析通过字符串解析器到达正则表达式解析器,都必须将其加倍
在正则表达式中,交替的this |匹配任何匹配this或that的内容。因此,如果我们要将列表转换为形式为re1 | re2 | re3 | | relast的单个正则表达式,我们可以同时检查与所有IP的匹配
然后我们可以进行一些重构,使正则表达式匹配器的工作更容易;在本例中,由于所有正则表达式都将有^…$,因此我们可以将这些约束从单个正则表达式中移出,并将它们放在整体上:^10\.\d+.\d+.\d+.\12\.122\.\d+.\d+.…$。括号使“^”不只是第一个模式的一部分,$不只是最后一个模式的一部分。但由于普通括号既可以捕获组,也可以捕获组,并且我们不需要捕获任何内容,所以我将它们替换为非分组版本?:
在这种情况下,我们可以对巨大的字符串进行一次全局搜索和替换,而不是对每个模式进行单独搜索。因此,结果是上面的代码:
const allowedRegexStr = '^(?:' +
allowedIPpatterns.
join('|').
replace(/\./g, '\\.').
replace(/X/g, '\\d+') +
')$';
那仍然只是一根线;我们必须将其转换为实际的RegExp对象来进行匹配:
const allowedRegexp = new RegExp(allowedRegexStr);
如前所述,这不会过滤出非法IP——例如,10.1234.5678.9012将匹配第一个模式。如果要将单个字节值限制在十进制范围0-255,可以使用比\d+更复杂的正则表达式,如下所示:
const regexStr = `^` + ipXpattern.
replace(/\./g, '\\.').
replace(/X/g, '\\d+') +
`$`;
(?:\d{1,2}|1\d{2}|2[0-4]\d|25[0-5])
匹配任何一个或两个数字,或“1”后跟任何两个数字,或“2”后跟“0”到“4”中的任何一个后跟任何数字,或“25”后跟“0”到“5”中的任何一个。将\d替换为将整个字符串蒙格表达式转换为以下内容:
const allowedRegexStr = '^(?:' +
allowedIPpatterns.
join('|').
replace(/\./g, '\\.').
replace(/X/g, '(?:\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])') +
')$';
使实际的正则表达式看起来更加笨拙:
^(?:10\.(?:\d{1,2}|1\d{2}|2[0-4]\d|25[0-5])\.(?:\d{1,2}|1\d{2}|2[0-4]\d|25[0-5]).(?:\d{1,2}|1\d{2}|2[0-4]\d|25[0-5])|12\.122\....
但你不必看它,只要和它比赛就行了 我不完全确定你在这里想要实现什么,其他人看起来也一样 但是,如果是验证,那么这里有一个解决方案来验证不使用正则表达式的IP地址。首先,在点处拆分输入字符串。然后对数字使用parseInt,确保其不高于255
function ipValidator(ipAddress) {
var ipSegments = ipAddress.split('.');
for(var i=0;i<ipSegments.length;i++)
{
if(parseInt(ipSegments[i]) > 255){
return 'fail';
}
}
return 'match';
}
而这将返回“失败”:
document.write(ipValidator('10.255.256.125'));
下面是JSFIDLE中的一个著名版本,其中有一些示例,是的,有可能:.*匹配所有这些。。。你的问题很模糊-你想要任何类型的IPv4地址匹配吗?如果没有,匹配的规则是什么?这是一个真正的X还是你的意思是作为任何东西的占位符?还有10个IP地址是什么?我有15个IP地址格式注意:格式有些是精确的IP地址,有些需要匹配我需要匹配的格式,如10.X.X.X。我提供了一些示例。您能解释一下这个正则表达式的作用吗?它匹配格式为X.X.X.X的字符串,其中X可以是1-3个数字或大写X。它的核心是这个子表达式\.X | \d{1,3}。它匹配一个句点,后跟1-3个数字或一个X。这是正则表达式sy的一个很好的参考
ntax:你能解释一下这行代码的作用吗?“^?”:“+allowedIPs.join'|'.replace/\./g'\.'\..replace/X/g'[^.]+'+'$'我看到它按照我的要求工作,非常好奇它是如何工作的。。