Regex Flex3正则表达式问题

Regex Flex3正则表达式问题,regex,apache-flex,flash,actionscript-3,validation,Regex,Apache Flex,Flash,Actionscript 3,Validation,我已经为我正在进行的一个项目编写了一个url验证程序。对于我的要求,它工作得很好,除非url的最后一部分超过22个字符,否则它会中断。我的表情是: /((https?):\/\/)([^\s.]+.)+([^\s.]+)(:\d+\/\S+)/i 它需要类似“http(s)://hostname:port/location”的输入。 当我给它输入时: https://demo10:443/111112222233333444445 它可以工作,但如果我传递输入 https://demo10:

我已经为我正在进行的一个项目编写了一个url验证程序。对于我的要求,它工作得很好,除非url的最后一部分超过22个字符,否则它会中断。我的表情是:

/((https?):\/\/)([^\s.]+.)+([^\s.]+)(:\d+\/\S+)/i
它需要类似“http(s)://hostname:port/location”的输入。 当我给它输入时:

https://demo10:443/111112222233333444445
它可以工作,但如果我传递输入

https://demo10:443/1111122222333334444455
它坏了。你可以很容易地测试出来。奇怪的是,我不能用相关(我认为)部分
/(:\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>

这是一个bug,无论是在Ryan的实现中还是在Flex/Flash中

上面使用的正则表达式语法(周围的斜杠和标志较少)与Python匹配,Python提供以下输出:

# ignore case insensitive flag as it doesn't matter in this case
>>> import re
>>> rx = re.compile('((https?):\/\/)([^\s.]+.)+([^\s.]+)(:\d+\/\S+)')
>>> print rx.match('https://demo10:443/1111122222333334444455').groups()
('https://', 'https', 'demo1', '0', ':443/1111122222333334444455')

我在RegexBuddy上调试了您的正则表达式,显然要找到匹配项需要数百万个步骤。这通常意味着正则表达式出现了严重错误

看看
([^\s.]+)+([^\s.]+)(:\d++/\s+

1-看起来你也在尝试匹配子域,但由于你没有逃过这个点,所以它没有按预期工作。如果您逃避它,demo10:443/123将不匹配,因为它至少需要一个点。将
([^\s.]+\)+
更改为
([^\s.]+\)*
,它就会工作

2-
[^\s.]+
是一个坏字符类,它将匹配整个字符串并从那里开始回溯。您可以通过使用将在冒号处停止的
[^\s:.]
来避免这种情况

这一个应该可以正常工作:
https?:\/\/([^\s:.]+\)*([^\s:.]+):\d+\/\s+

这肯定不仅仅是他的实现,因为它在我的代码中也不起作用。有趣。我注意到Ryan的实现开始随着url越来越长而变慢,所以我想知道这是正则表达式分析算法的问题。如果你有一个工作代码样本,请粘贴。工程伟大,谢谢!你确实忘记了d+后面的斜杠,但不用担心。https?:\/\/([^\s:.]+\)*([^\s:.]+):\d+\/\s+