Javascript多正则表达式模式

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{

我试图排除一些内部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{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'[^.]+'+'$'我看到它按照我的要求工作,非常好奇它是如何工作的。。