ตรวจสอบว่าสตริงมีช่องว่างหรือไม่


100

ฉันกำลังพยายามตรวจสอบว่าสตริงมีช่องว่างหรือไม่ ฉันพบฟังก์ชันนี้ แต่ดูเหมือนจะใช้งานไม่ได้:

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


ตรรกะของคุณถอยหลังจริงหมายถึงเท็จ
Brian Schroth

2
คุณส่งคืนเท็จหากสตริงมีช่องว่างตรรกะของคุณจะย้อนกลับ
Christopher Francisco

นิพจน์ที่เป็นปัญหาจะตรวจสอบรูปแบบที่มีเฉพาะช่องว่างในสตริงเริ่มต้นด้วยช่องว่างมีช่องว่างอย่างน้อยหนึ่งช่องและลงท้ายด้วยช่องว่าง
Priya Ranjan Singh

คำตอบ:


248

คุณสามารถใช้เมธอดindexOfบนสตริงอินพุต:

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

หรือคุณสามารถใช้วิธีการทดสอบบน RegEx แบบธรรมดา:

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

นอกจากนี้ยังตรวจสอบอักขระช่องว่างอื่น ๆ เช่น Tab


19
สิ่งนี้ไม่ได้ตรวจสอบพื้นที่สีขาวประเภทอื่น ๆ (เช่น \ t)
Bernard Chen

3
คุณใส่ s.indexOf (/ ^ \ s + $ /) ด้วยไม่ได้หรือ
Zoidberg

2
IE8 ไม่รองรับสิ่งนี้ (เป็นเพียง fyi ที่เป็นมิตร ... )
gloomy.penguin

@ CMS & @Bernard - ไม่ทำงาน [s.indexOf ('') works]
Shawn Rebelo

22

regex ของคุณจะไม่ตรงกับอะไรเลยอย่างที่เป็นอยู่ แน่นอนคุณต้องลบเครื่องหมายคำพูด - "/"อักขระก็เพียงพอแล้ว

/^\s+$/กำลังตรวจสอบว่าสตริงเป็นช่องว่างทั้งหมดหรือไม่ :

  • ^ ตรงกับจุดเริ่มต้นของสตริง
  • \s+ หมายถึงช่องว่างอย่างน้อย 1 อาจมากกว่านั้น
  • $ ตรงกับจุดสิ้นสุดของสตริง

ลองแทนที่ regex ด้วย/\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;
};

แล้วก็แทนที่ด้วยsomessome

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

ฉันไม่ได้เรียกใช้การวัดประสิทธิภาพ แต่ควรเร็วกว่า regex แต่สำหรับตัวอย่างข้อความขนาดเล็กจะไม่มีความแตกต่างมากนัก


0

อีกสองสามคนได้โพสต์คำตอบ มีปัญหาบางอย่างที่ชัดเจนเช่นส่งกลับfalseเมื่อ Regex ผ่านไปและตัวดำเนินการ^และ$ระบุจุดเริ่มต้น / สิ้นสุดในขณะที่คำถามกำลังมองหามีช่องว่าง (ใด ๆ ) และไม่ได้มีเพียงช่องว่าง (ซึ่ง regex กำลังตรวจสอบ)

นอกจากนั้นปัญหานี้เป็นเพียงการพิมพ์ผิด

เปลี่ยนสิ่งนี้ ...

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

สำหรับสิ่งนี้...

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

เมื่อใช้ regex ภายใน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>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.