Проверьте, есть ли в строке пробел

97

Я пытаюсь проверить, есть ли в строке пробел . Я нашел эту функцию, но, похоже, она не работает:

function hasWhiteSpace(s) 
{
    var reWhiteSpace = new RegExp("/^\s+$/");

    // Check for white space
    if (reWhiteSpace.test(s)) {
        //alert("Please Check Your Fields For Spaces");
        return false;
    }

    return true;
}

Кстати, я добавил цитаты в RegExp.

Здесь что-то не так? Есть ли что-нибудь получше, что я могу использовать? Надеюсь, JQuery.

Abs
источник
ваша логика обратная, истина означает ложь.
Брайан Шрот
2
Вы возвращаете false, если в строке есть пробелы, ваша логика обратная
Кристофер Франциско
Это регулярное выражение проверяет наличие шаблонов только с пробелами в строках, начинается с пробелов, имеет один или несколько пробелов и заканчивается пробелом.
Прия Ранджан Сингх,

Ответы:

247

Вы можете просто использовать метод indexOf во входной строке:

function hasWhiteSpace(s) {
  return s.indexOf(' ') >= 0;
}

Или вы можете использовать тестовый метод в простом RegEx:

function hasWhiteSpace(s) {
  return /\s/g.test(s);
}

Это также проверит наличие других символов пробела, таких как Tab.

Кристиан К. Сальвадо
источник
19
это не проверяет наличие других типов пробелов (например, \ t).
Бернард Чен
3
не могли бы вы также ввести s.indexOf (/ ^ \ s + $ /)?
Зойдберг
2
IE8 не поддерживает это (просто дружелюбный клич ...)
gloomy.penguin
@ CMS и @Bernard - Не работает [s.indexOf ('') работает]
Шон Ребело
22

Ваше регулярное выражение ни с чем не будет соответствовать. Обязательно нужно убрать кавычки - "/"символов достаточно.

/^\s+$/проверяет, является ли строка ВСЕМИ пробелами:

  • ^ соответствует началу строки.
  • \s+ означает минимум 1, а возможно и больше пробелов.
  • $ соответствует концу строки.

Попробуйте заменить регулярное выражение на /\s/(и без кавычек)

Ян Клелланд
источник
1

Эта функция проверяет наличие других типов пробелов, а не только пробелов (табуляция, возврат каретки и т. Д.)

import some from 'lodash/fp/some'
const whitespaceCharacters = [' ', '  ',
  '\b', '\t', '\n', '\v', '\f', '\r', `\"`, `\'`, `\\`,
  '\u0008', '\u0009', '\u000A', '\u000B', '\u000C',
'\u000D', '\u0020','\u0022', '\u0027', '\u005C',
'\u00A0', '\u2028', '\u2029', '\uFEFF']
const hasWhitespace = char => some(
  w => char.indexOf(w) > -1,
  whitespaceCharacters
)

console.log(hasWhitespace('a')); // a, false
console.log(hasWhitespace(' ')); // space, true
console.log(hasWhitespace(' ')); // tab, true
console.log(hasWhitespace('\r')); // carriage return, true

Если вы не хотите использовать Lodash , то вот простая someреализация с 2 s:

const ssome = (predicate, list) =>
{
  const len = list.length;
  for(const i = 0; i<len; i++)
  {
    if(predicate(list[i]) === true) {
      return true;
    }
  }
  return false;
};

Тогда просто замените someна ssome.

const hasWhitespace = char => some(
  w => char.indexOf(w) > -1,
  whitespaceCharacters
)

Для тех, кто находится в Node, используйте:

const { some } = require('lodash/fp');
JesterXL
источник
0

Вот моя предлагаемая проверка:

var isValid = false;

// Check whether this entered value is numeric.
function checkNumeric() {
    var numericVal = document.getElementById("txt_numeric").value;

    if(isNaN(numericVal) || numericVal == "" || numericVal == null || numericVal.indexOf(' ') >= 0) {
        alert("Please, enter a numeric value!");
        isValid = false;
    } else {
        isValid = true;
    }
}
КиборгГолова
источник
0

Один простой подход, который вы можете использовать, - это сравнить длину исходной строки с длиной строки, чтобы пробелы не заменялись ничем. Например:

function hasWhiteSpaces(string) {
    if (string.length == string.replace(" ", "").length) {return false}
    return true
}
PaulG
источник
0

С дополнениями к языку это намного проще, плюс вы можете воспользоваться преимуществами раннего возврата:

// Use includes method on string
function hasWhiteSpace(s) {
  const whitespaceChars = [' ', '\t', '\n'];
  return whitespaceChars.some(char => s.includes(char));
}

// Use character comparison
function hasWhiteSpace(s) {
  const whitespaceChars = [' ', '\t', '\n'];
  return Array.from(s).some(char => whitespaceChars.includes(char));
}

const withSpace = "Hello World!";
const noSpace = "HelloWorld!";

console.log(hasWhiteSpace(withSpace));
console.log(hasWhiteSpace(noSpace));

console.log(hasWhiteSpace2(withSpace));
console.log(hasWhiteSpace2(noSpace));

Я не запускал тест производительности, но он должен быть быстрее, чем регулярное выражение, но для небольших текстовых фрагментов в любом случае не будет такой большой разницы.

snnsnn
источник
0

Несколько других опубликовали ответы. Есть некоторые очевидные проблемы, как она возвращается , falseкогда Regex проходит, а ^и $операторы указывают на начало / конец, в то время как вопрос ищет имеет (любой) пробельных, а не: содержит только пробелы (что регулярное выражение проверки).

Кроме того, это всего лишь опечатка.

Измени это ...

var reWhiteSpace = new RegExp("/^\s+$/");

К этому...

var reWhiteSpace = new RegExp("\\s+");

При использовании регулярного выражения внутри RegExp()вы должны сделать две следующие вещи ...

  • Опускайте начальные и конечные /скобки.
  • Двойное экранирование кода всех последовательностей, т. Е. \\sВместо \sи т. Д.

Полная рабочая демонстрация из исходного кода ....

$(document).ready(function(e) { function hasWhiteSpace(s) {
        var reWhiteSpace = new RegExp("\\s+");
    
        // Check for white space
        if (reWhiteSpace.test(s)) {
            //alert("Please Check Your Fields For Spaces");
            return 'true';
        }
    
        return 'false';
    }
  
  $('#whitespace1').html(hasWhiteSpace(' '));
  $('#whitespace2').html(hasWhiteSpace('123'));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
" ": <span id="whitespace1"></span><br>
"123": <span id="whitespace2"></span>

HoldOffHunger
источник