Использование регулярных выражений
haXe имеет встроенную поддержку регулярных выражений. Они используются для проверки формата строки или для извлечения определенных данный из текста. Регулярное выражение начинается с ~/ и заканчивается /:
var r : EReg = ~/world/; var str = "hello world"; trace(r.match(str)); // true : 'world' найдено в строке trace(r.match("hello !")); // false
Можно использовать стандартные паттерны, такие как:
.: любой символ*: от 0 и больше вхождений символа+: от 1 и больше вхождений символа?: 1 или 0 вхождений символа[A-Z0-9]: диапазон символов[^\r\n\t]: исключая символы(...): скобки для объеденения груп символов^: начало строки$: конец строки
Например, следующее регулярное выражение проверяет правильность E-mail адреса:
~/[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z][A-Z][A-Z]?/i;
Примечание: "i" в конце регулярного выражение это Флаг, указывающий на игнорирование регистра символов.
Можно использовать следующие флаги:
- "i" : игнорировать регистр символов
- "g" : глобальный поиск или замена (объясняется ниже)
- "m" : многострочный поиск, "^" и "$" представляют начало и конец всей строки
- "s" : точка "." также соответствует символам перевода строки (только для серверного haXe)
Группировка
Группировка позволяет извлекать отдельные части подстроки, совпавшей с регулярным выражением:
var str = "Nicolas is 26 years old"; var r = ~/([A-Za-z]+) is ([0-9]+) years old/; r.match(str); trace(r.matched(1)); // "Nicolas" trace(r.matched(2)); // "26"
Значение "r.matched(0)" всегда содержит всю совпавшую подстроку, а "r.matchedPos()" вернет позицию начала подстроки в исходной строке:
var str = "abcdeeeeefghi"; var r = ~/e*/; r.match(str); trace(r.matched(0)); // "eeeee" trace(r.matchedPos()); // { pos : 4, len : 5 }
Замена подстроки
Регулярные выражения могут использоваться для замены подстроки:
var str = "aaabcbcbcbz"; var r = ~/b[^c]/g; // g - флаг, указывает на необходимость замены всех вхождений подстроки trace(r.replace(str,"xx")); // "aaaxxxxxxbz"
Можно использовать "$X" для повторного указания на совпавшую группу в выражении:
var str = "{hello} {0} {again}"; var r = ~/{([a-z]+)}/g; trace(r.replace(str,"*$1*")); // "*hello* {0} *again*"
Разбиение строки
Регулярное выражение может использоваться для разбиения строки на массив подстрок. В этом случае оно выступает в роли разделителя вместо константной подстроки:
var str = "XaaaYababZbbbW"; var r = ~/[ab]+/g; trace(r.split(str)); // ["X","Y","Z","W"]
Особенности реализации
Регулярные выражения реализованы:
- в Javascript, на базе объекта RegExp, предоставляемого браузером.
- в Neko, на базе библиотеке PCRE
- в Flash9, на базе встроенной реализации флэш-плеера
- FIXME в Flash 6/8 пока не реализовано, но планируется