Javascript 正则表达式在匹配后停止,在使用交替符号时不再进一步匹配

Javascript 正则表达式在匹配后停止,在使用交替符号时不再进一步匹配,javascript,regex,Javascript,Regex,我从昨天开始就在努力解决这个问题,我相信我遗漏了一些非常简单的东西 我编写了一个正则表达式来匹配三种IP地址格式中的任意一种: Pattern to match : X.X.X.X OR X.X.X.X/X.X.X.X OR X.X.X.X-X.X.X.X Regex: /^(([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4

我从昨天开始就在努力解决这个问题,我相信我遗漏了一些非常简单的东西

我编写了一个正则表达式来匹配三种IP地址格式中的任意一种:

Pattern to match : X.X.X.X OR X.X.X.X/X.X.X.X OR X.X.X.X-X.X.X.X
Regex:

/^(([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\/([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5]))|(([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\-([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5]))|(([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5]))$/
问题:

/^(([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\/([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5]))|(([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\-([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5]))|(([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5]))$/
正则表达式与上述3种格式匹配,但问题在于交替符号-一旦找到匹配项,正则表达式就会停止

Example: 1.1.1.1/1.1.1.1 - Once this match is found it does not check after that.

i.e: 1.1.1.1/1.1.1.1 - Valid 

 But 1.1.1.1/1.1.1.1(...anything after this is also recognized as valid which should not be the case...)
问题:

/^(([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\/([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5]))|(([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\-([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5]))|(([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5]))$/
如何使其仅与3个备选方案中的一个匹配。我也尝试过
单词边界(\b)
,但我不确定这是否是需要的


非常感谢您的帮助。

我不确定您是否要匹配多个,但如果是这样,请从开头删除“^”,从结尾删除“$”,并按如下方式进行全局搜索:

/(([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\/([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5]))|(([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\-([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5]))|(([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5]))/g

希望这有帮助

您可以将正则表达式缩短为:

^(((([0-2][0-5][0-6])|(\d{1,2}))\.){3}((([0-2][0-5][0-6])|(\d{1,2}))))([/-](((([0-2][0-5][0-6])|(\d{1,2}))\.){3}(([0-2][0-5][0-6])|(\d{1,2}))))*$
如果您使用javascript运行它,您将使用
/…/

var模式=newregexp(/^((([0-2][0-5][0-6])|([d{1,2}))\{3}(([0-2][0-5][0-6])|([d{1,2}])(([0-2][0-5][0-6])|([d{1,2}))\{3}([0-2][0-5][0-6][1,2}]){2};
var testCases={};
//应该有用
测试用例['testCaseA']='1.2.3.4';
测试用例['testCaseB']='1.2.3.4/1.256.3.4';
测试用例['testCaseC']='1.2.3.4-1.2.3.4';
//不应该起作用
测试用例['testCaseD']='1.257.3.4';
测试用例['testCaseE']='1.2.3.4/1.2.3.356';
测试用例['testCaseF']='1.2.3.4-1.2.3.4I';
var结果='CasesInputsOutputs';
$。每个(测试用例、函数(k、v){
结果+='+k+'  '+v+'  '+模式。测试(v)+';
});
文件。书写(结果+“”)

问题在于,在所有正则表达式构造中,交替的优先级最低。您的正则表达式与以下任一项匹配:

^X.X.X.X/X.X.X.X    // anchored at start only

可以通过在除锚以外的所有对象周围添加另一组括号来修复此问题:

^(your regex)$
试试这个正则表达式:

(^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$)|(^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)[\/-](?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$)
您可以使用以下链接对其进行测试以进行验证


问题仍然存在。我希望正则表达式能够识别1.1.1.1/1.1.1.1(…在此之后的任何内容都是无效的…)。但是,由于它与1.1.1.1/1.1.1.1匹配,因此它不关心超出该值的匹配。但是你试过我给你的正则表达式了吗?它也匹配256.256.256.256。我对数字的正则表达式没有问题。我打算匹配一组特定的数字。但是问题如上所述。为简化起见,我使用了1.1.1.1.1作为示例。@Moishe-我在定义
X.X.X
格式中的
X
时没有任何问题。但正如你们将看到的,我希望
X.X.X.X/X.X.X.X
是有效的,而不是
X.X.X.X/X.X.X.X(…这之后的任何符号)
我只想说它拒绝了一个有效的ip地址。@VamsiKrishna感谢你们指出。起初我没注意到,但现在应该可以了。太好了!。谢谢。这就是我要找的。我可以请你补充一些解释(一行就足够了)关于它是如何工作的以及我的正则表达式缺少了什么?很高兴我能提供帮助。与regex相关的解释部分可以在提供的链接(regex101)的右侧看到。说到你的正则表达式丢失了什么也许我现在不能这么做。但是,我有时间一定会告诉你的。是的,我知道了。感谢您抽出时间@Vamsi!酷..如果我在正则表达式中添加额外的偏执,它也会起作用。谢谢!