Почему совпадение находит результат, в то время как тест возвращает false для регулярного выражения в JavaScript?
-
22-08-2019 - |
Вопрос
Я пытался отладить проблему сортировки с помощью плагина jquery. сортировщик столов который использует следующий код для проверки цифр:
this.isDigit = function(s,config) {
var DECIMAL = '\\' + config.decimal;
var exp = '/(^[+]?0(' + DECIMAL +'0+)?$)|(^([-+]?[1-9][0-9]*)$)|(^([-+]?((0?|[1-9][0-9]*)' + DECIMAL +'(0*[1-9][0-9]*)))$)|(^[-+]?[1-9]+[0-9]*' + DECIMAL +'0+$)/';
return RegExp(exp).test($.trim(s));
};
значение для config.decimal равно '.'
Теперь, если s = '0', это не удается, но если вместо этого вы запустите match, RegEx, похоже, ответит положительно, как и ожидалось.
return exp.match($.trim(s)) != null
Как эта обработка отличается, чтобы возвращать разные результаты?
На всякий случай вам нужен HTML-код, на основе которого получен s (последний столбец отображается как текст):
<tr class="">
<td><a href="#">Click</a></td>
<td>Annen Woods</td>
<td>131</td>
<td>20</td>
<td>5</td>
<td>3</td>
<td>12</td>
<td>6</td>
<td>50%</td>
<td>0</td>
</tr>
Я понимаю, что test возвращает логическое значение, а match возвращает строку или ноль.
Главный вопрос: почему нет этого регулярного выражения:
return RegExp(exp).test($.trim(s));
эквивалентно:
return exp.match($.trim(s)) != null
Решение
Я думаю, что это немного странное совпадение из-за функции, используемой для создания регулярного выражения.
Match является членом String.
Test является членом RegExp.
Однако в этой функции exp определяется как строка.Итак, технически вы запускаете функцию match() класса String, используя exp как строковое значение, а не как регулярное выражение.
Запуск exp через конструктор RegExp должен возвращать тот же результат, что и test().
Другие советы
match возвращает массив значений, test возвращает логическое значение, в некоторых движках тест возвращает первый результат
Оказывается, это разворот соответствующих объектов.
return exp.match($.trim(s)) != null
должно быть
return $.trim(s).match(exp) != null
Исходный код просто проверял наличие «0» в строке RegEx.
Кажется, в tablesorter все еще есть ошибка.Вы должны объявить парсер как «цифру», если в вашей таблице присутствуют 0 значений. Проблема с сортировщиком таблиц JQuery