Проблема регулярного выражения Flex 3 - PullRequest
3 голосов
/ 11 марта 2010

Я написал валидатор 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>

Ответы [ 2 ]

1 голос
/ 12 марта 2010

Я отладил ваше регулярное выражение в RegexBuddy, и, очевидно, для поиска соответствия требуются миллионы шагов Обычно это означает, что с регулярным выражением что-то не так.

Посмотрите на ([^\s.]+.)+([^\s.]+)(:\d+\/\S+).

1 - Похоже, вы тоже пытаетесь сопоставить субдомены, но это не работает так, как задумано, поскольку вы не ушли от точки. Если вы избежите этого, demo10: 443/123 не будет соответствовать, потому что для этого потребуется хотя бы одна точка. Измените ([^\s.]+\.)+ на ([^\s.]+\.)*, и оно будет работать.

2- [^\s.]+ - это плохой класс символов, он будет соответствовать всей строке и начнет откат назад. Вы можете избежать этого, используя [^\s:.], который остановится на двоеточии.

Этот должен работать так, как вы хотите: https?:\/\/([^\s:.]+\.)*([^\s:.]+):\d+\/\S+

1 голос
/ 11 марта 2010

Это ошибка, как в реализации Райана, так и во Flex / Flash.

Синтаксис регулярного выражения, использованный выше (без косых черт и флагов), соответствует 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')
...