Überprüfen Sie, ob eine Zeichenfolge Leerzeichen enthält


95

Ich versuche zu überprüfen, ob eine Zeichenfolge Leerzeichen enthält . Ich habe diese Funktion gefunden, aber sie scheint nicht zu funktionieren:

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

Übrigens habe ich Zitate hinzugefügt RegExp.

Stimmt irgendetwas nicht? Gibt es etwas Besseres, das ich verwenden kann? Hoffentlich JQuery.


Ihre Logik ist rückwärts, wahr bedeutet falsch.
Brian Schroth

2
Sie geben false zurück, wenn die Zeichenfolge Leerzeichen enthält. Ihre Logik ist rückwärts
Christopher Francisco,

Dieser fragliche Regex sucht nach Mustern mit nur Leerzeichen in Zeichenfolgen, beginnt mit Leerzeichen, hat ein oder mehrere Leerzeichen und endet mit einem Leerzeichen.
Priya Ranjan Singh

Antworten:


240

Sie können einfach die indexOf- Methode für die Eingabezeichenfolge verwenden:

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

Oder Sie können die Testmethode auf einem einfachen RegEx verwenden:

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

Dadurch wird auch nach anderen Leerzeichen wie Tab gesucht.


17
Dies sucht nicht nach anderen Arten von Leerzeichen (z. B. \ t).
Bernard Chen

3
Könnten Sie nicht auch s.indexOf (/ ^ \ s + $ /) eingeben?
Zoidberg

2
Dies wird nicht von IE8 unterstützt (nur eine freundliche fyi ...)
gloomy.penguin

@ CMS & @Bernard - Funktioniert nicht [s.indexOf ('') funktioniert]
Shawn Rebelo

21

Ihre Regex passt zu nichts, so wie es ist. Sie müssen auf jeden Fall die Anführungszeichen entfernen - die"/" Zeichen sind ausreichend.

/^\s+$/prüft, ob der String ALL Whitespace ist:

  • ^ entspricht dem Anfang der Zeichenfolge.
  • \s+ bedeutet mindestens 1, möglicherweise mehr Leerzeichen.
  • $ stimmt mit dem Ende der Zeichenfolge überein.

Versuchen Sie, den regulären Ausdruck durch /\s/(und keine Anführungszeichen) zu ersetzen.


1

Diese Funktion sucht nach anderen Arten von Leerzeichen, nicht nur nach Leerzeichen (Tabulator, Wagenrücklauf usw.).

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

Wenn Sie Lodash nicht verwenden möchten , finden Sie hier eine einfache someImplementierung mit 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;
};

Dann ersetzen Sie einfach somemit ssome.

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

Verwenden Sie für diejenigen in Node:

const { some } = require('lodash/fp');

0

Hier ist meine vorgeschlagene Validierung:

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

Ein einfacher Ansatz besteht darin, die Länge der ursprünglichen Zeichenfolge mit der Länge der Zeichenfolge zu vergleichen, um Leerzeichen durch nichts zu ersetzen. Beispielsweise:

function hasWhiteSpaces(string) {
    if (string.length == string.replace(" ", "").length) {return false}
    return true
}

0

Mit Ergänzungen der Sprache ist es viel einfacher, und Sie können von einer frühen Rückkehr profitieren:

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

Ich habe keinen Leistungsbenchmark durchgeführt, aber diese sollten schneller als Regex sein, aber für kleine Textausschnitte gibt es sowieso keinen so großen Unterschied.


0

Einige andere haben Antworten gepostet. Es gibt einige offensichtliche Probleme, wie die Rückkehr, falsewenn der Regex übergeben wird, und die Operatoren ^und $geben Start / Ende an, während die gesuchte Frage (beliebige) Leerzeichen enthält und nicht: nur Leerzeichen enthält (die der reguläre Ausdruck überprüft).

Außerdem ist das Problem nur ein Tippfehler.

Ändere das...

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

Dazu ...

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

Wenn Sie einen regulären Ausdruck verwenden RegExp(), müssen Sie die folgenden zwei Schritte ausführen ...

  • Start- und Endklammern weglassen /.
  • Doppelter Escape-Code für alle Sequenzen, dh \\sanstelle von \susw.

Voll funktionsfähige Demo aus dem Quellcode ....

$(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>

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.