regex - Flex 3 正则表达式问题

标签 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: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/

相关文章:

java - Android/java 更改 RSS 附件字符串可能是正则表达式

c - 使用regex.h时如何在c中匹配字母 "$"?

Python 正则表达式 - 删除标点符号但保留 <uk> 原样

apache-flex - Mac OS X 和 Adob​​e Air 跟踪不起作用

html - 如何在 google swiffy 的新版本运行时中删除背景

arrays - 如何定义一个包含单个元素的数组?

javascript - 如何在 javascript RegExp 中获取所有括号捕获

java - 如何从 Java 调用 Flex/Flash/Actionscript 方法?

java - 使用 BlazeDS 将 ActionScript/Flex ArrayCollection 将 Number 对象转换为 Java Collection<Long>

flash - 在 Flex 3/Flash 中取消键盘事件