我为我正在从事的项目编写了一个 url 验证器。对于我的要求,它工作得很好,除非 url 的最后一部分超过 22 个字符时它会中断。我的表情:
/((https?):\/\/)([^\s.]+.)+([^\s.]+)(:\d+\/\S+)/i
它期望输入类似于“http(s)://hostname:port/location”。 当我给它输入时:
https://demo10:443/111112222233333444445
它有效,但如果我传递输入
https://demo10:443/1111122222333334444455
它坏了。您可以在 http://ryanswanson.com/regexp/#start 轻松测试它.奇怪的是,我无法仅用相关的(我认为)部分 /(:\d+\/\S+)/i
重现该问题。我可以在所需的/之后拥有尽可能多的字符,而且效果很好。有任何想法或已知错误吗?
编辑: 以下是演示该问题的示例应用程序的一些代码:
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
private function click():void {
var value:String = input.text;
var matches:Array = value.match(/((https?):\/\/)([^\s.]+.)+([^\s.]+)(:\d+\/\S+)/i);
if(matches == null || matches.length < 1 || matches[0] != value) {
area.text = "No Match";
}
else {
area.text = "Match!!!";
}
}
]]>
</mx:Script>
<mx:TextInput x="10" y="10" id="input"/>
<mx:Button x="178" y="10" label="Button" click="click()"/>
<mx:TextArea x="10" y="40" width="233" height="101" id="area"/>
</mx:Application>
最佳答案
我在 RegexBuddy 上调试了您的正则表达式,显然需要数百万步才能找到匹配项。这通常意味着正则表达式存在严重错误。
查看 ([^\s.]+.)+([^\s.]+)(:\d+\/\S+)
。
1- 看起来您也在尝试匹配子域,但它没有按预期工作,因为您没有转义圆点。如果转义它,demo10:443/123 将不匹配,因为它至少需要一个点。将 ([^\s.]+\.)+
更改为 ([^\s.]+\.)*
即可。
2- [^\s.]+
是一个不好的字符类,它会匹配整个字符串并从那里开始回溯。您可以通过使用将在冒号处停止的 [^\s:.]
来避免这种情况。
这个应该可以如你所愿地工作:
https?:\/\/([^\s:.]+\.)*([^\s:.]+):\d+\/\S+
关于regex - Flex 3 正则表达式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2427710/