Регулярное выражение для пустой строки или пробелов
Описание проблемы
Я пытаюсь обнаружить, вводит ли пользователь пробелы в текстовом поле. У меня есть следующий код:
var regex = "^\s+$";
if($("#siren").val().match(regex)) {
echo($("#siren").val());
error += 1;
$("#siren").addClass("error");
$(".div-error").append("- Champ Siren/Siret ne doit pas etre vide<br/>");
}
Условие if($("#siren").val().match(regex))
должно проверять, является ли строка только пробелами, однако почему-то это не работает. В чем может быть моя ошибка?
Спасибо за помощь!
5 ответ(ов)
Проблема с \
(обратный слэш) в вызове .match
заключается в том, что он неправильно экранирован. Конечно, проще использовать литерал регулярного выражения. Оба варианта будут работать:
var regex = "^\\s+$";
var regex = /^\s+$/;
Также имейте в виду, что знак +
требует наличия хотя бы одного пробела. Возможно, вам стоит использовать *
, чтобы включить возможность нуля или более пробелов.
Если вы ищете пустую строку в дополнение к пробелам, вам нужно использовать *
, а не +
.
В вашем случае регулярное выражение ^\s*$
правильно проверяет, является ли строка пустой или состоит только из пробелов. Знак *
означает "0 или более" соответствий, тогда как +
требует хотя бы одно соответствие. Поэтому использование *
гарантирует, что пустая строка (или строка, содержащая только пробелы) также будет соответствовать вашему выражению.
Если вы хотите проверить, что строка не содержит ничего, кроме пробелов, ваше регулярное выражение уже написано верно:
var regex = /^\s*$/;
Так что проблем с вашим регекспом нет, просто убедитесь, что вы используете *
, если пустая строка — это допустимый вариант.
Если вы используете jQuery, у вас есть метод .trim()
. Пример проверки на пустое значение поля с id siren
может выглядеть так:
if ($("#siren").val().trim() === "") {
// поле пустое
}
Метод .trim()
удаляет пробелы в начале и в конце строки, поэтому условие будет истинным, если в поле ничего нет или только пробелы.
Если вас интересует только пробел в начале и конце строки (без учета пробелов в середине), то можно воспользоваться методом String.trim()
:
" ваше содержимое строки ".trim();
// => "ваше содержимое строки"
Этот метод удаляет все пробелы до и после текста, оставляя пробелы между словами нетронутыми.
Ваш код, как я вижу, предполагает проверку на совпадение строки с нулями и пробелами. Однако, чтобы ваше решение работало корректно, стоит немного улучшить его. Ваша регулярная выражение уже правильно настроено для проверки на пустую строку или строку, состоящую только из пробелов.
Вот исправленный код и пояснение:
var error=0;
var test = [" ", " "];
if(test[0].match(/^\s*$/)) { // Убираем 'g' флаг, так как это не нужно
$("#output").html("MATCH!");
error += 1;
} else {
$("#output").html("no_match");
}
Объяснение:
В вашем регулярном выражении
^\s*$
проверяет, состоит ли строка только из пробелов или пуста. Флагg
(глобальный) не нужен, так какmatch
возвращает первое совпадение, и вы не хотите искать по всей строке.test
содержит массив строк. Вы проверяете только первую строкуtest[0]
(то есть" "
). Если вы хотите проверить и другие строки в массиве, вам нужно будет использовать цикл.Если
test[0]
соответствует выражению (то есть является пустой или состоит только из пробелов), вы выводите "MATCH!", иerror
увеличивается на 1.
Если вам нужно проверить все строки в массиве test
, вы можете сделать это следующим образом:
var error = 0;
var test = [" ", " "];
for (var i = 0; i < test.length; i++) {
if (test[i].match(/^\s*$/)) {
$("#output").append("MATCH! for '" + test[i] + "'<br>");
error += 1;
} else {
$("#output").append("no_match for '" + test[i] + "'<br>");
}
}
Таким образом, вы проверите каждую строку в массиве и выведете соответствующий результат для каждой из них.
Регулярное выражение для замены нескольких пробелов на один пробел
Как использовать регулярные выражения в селекторах jQuery?
Прокрутка к элементу с использованием jQuery
Как определить нажатие клавиши Esc?
Как выполнить код после сброса HTML-формы с помощью jQuery?