Перевірте, чи є в рядку пробіли


96

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

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.


ваша логіка зворотна, істина означає хибна.
Брайан Шрот

2
Ви повертаєте false, якщо в рядку є пробіли, ваша логіка є зворотною
Крістофер Франциско

Цей регулярний вираз перевіряє наявність шаблонів із лише пробілами в рядках, починається з пробілів, має один або декілька пробілів і закінчується пробілами.
Прия Ранджан Сінгх,

Відповіді:


241

Ви можете просто використовувати метод indexOf у вхідному рядку:

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

Або ви можете використовувати метод тестування на простому RegEx:

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

Це також перевірить наявність інших пробілів, таких як Tab.


18
це не перевіряє наявність інших типів пробілів (наприклад, \ t).
Бернард Чен

3
Ви не могли б також вказати s.indexOf (/ ^ \ s + $ /)?
Zoidberg

2
це не підтримується IE8 (просто дружній фей ...)
gloomy.penguin

@ CMS & @Bernard - Не працює [s.indexOf ('') works]
Шон Ребело

21

Ваш регулярний вираз нічим не відповідає, як є. Вам обов’язково потрібно видалити лапки - "/"символів достатньо.

/^\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');

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
}

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));

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


0

Кілька інших опублікували відповіді. Є деякі очевидні проблеми, наприклад, він повертається, falseколи регулярний вираз проходить, а оператори ^and $вказують початок / кінець, тоді як питання, яке шукається, має (будь-який) пробіл, а не: містить лише пробіли (які регулярний вираз перевіряє).

Окрім цього, питання полягає лише в друкарській помилці.

Змінити це ...

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>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.