Использование регулярных выражений

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 пока не реализовано, но планируется

version #7008, modified 2009-09-16 20:20:52 by Kolan