Коллеги, уверяю Вас - он заблуждается. Это прекрасные методы для глобального поиска всех соответствий заданному шаблону. В общем, метод .text() можно рассматривать как частный случай метода .exec():
if ( re.test(string) )
if ( re.exec(string) != null )
Пример 1.
В качестве примера можете глянуть на модуль обработки INI файлов:
var text = 'abc\ndef\n\n\nklmn\n\nxyz\n\n\n';
var re = /[^\r\n]+/g;
var r;
while ( r = re.exec(text) ) {
alert(r);
}
В текстовой переменной text ищутся "значащие" подстроки, то есть содержащие любые символы кроме символов перевода строк (\r\n - в windows, \n - в unix). В переменной r возвращается массив совпадений (0 - найденная подстрока, 1 - совпадение в первой скобке, 2 - совпадение во второй скобке и т.д.). Найденное значение используется в дальнейших вычислениях. А повторный поиск ведется с запомненной позиции RegExp.lastIndex. Когда все совпадения исчерпаны, метод вернет значение null, а цикл завершит свою работу, так как while null преобразуется в while false, что приведет к завершению цикла.
То что уважаемый jite подразумевает под "глючностью" является особенностью методов. Так как при включенной "глобальности" при сопоставлении происходит обновления всех свойств объекта, а так же и свойств объекта RegExp. Посмотрите модифицированный пример:
var text = 'abc\ndef\n\n\nklmn\n\nxyz\n\n\n';
var re = /([^\r\n]+)/g;
var r;
while ( r = re.exec(text) ) {
alert('index: ' + r.index);
alert('index: ' + RegExp.index);
alert('last index: ' + r.lastIndex);
alert('last index: ' + RegExp.lastIndex);
alert(r[1]);
alert(RegExp.$1);
}
Если вы активно используете свойства объекта RegExp, то можете столкнутся с проблемой использования нескольких регулярных выражений, когда они перезаписывают результат выполнения.
Пример 2.
Но и это не все. Вот пример:
var s = '123abc456def789'
var t = 'abcdef1111111'
var re = /\d+/g
re.exec(s); // ['123']
re.exec(t); // ['1111111']
re.exec(s); // ['89']
В последней строке возвращается неполное совпадение.
Вот два простых совета
1. Не надейтесь на свойства RegExp, а используйте результат возвращенный методом.
2. Не меняйте контекст глобального поиска.
( 2 * b ) || ! ( 2 * b )