Почему совпадение находит результат, в то время как тест возвращает false для регулярного выражения в JavaScript?

StackOverflow https://stackoverflow.com/questions/883625

  •  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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top