检查字符串是否有空格

IT技术 javascript whitespace
2021-03-07 12:53:34

我正在尝试检查字符串是否有空格我找到了这个功能,但它似乎不起作用:

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。

6个回答

您可以简单地对输入字符串使用indexOf方法:

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

或者您可以在简单的 RegEx 上使用测试方法:

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

这还将检查其他空白字符,如 Tab。

这不受 IE8 支持(只是一个友好的仅供参考...)
2021-05-05 12:53:34
你不能把 s.indexOf(/^\s+$/) 也放进去吗?
2021-05-08 12:53:34
@CMS& @Bernard - 不起作用 [s.indexOf(' ') 有效]
2021-05-11 12:53:34
这不会检查其他类型的空格(例如,\t)。
2021-05-15 12:53:34

你的正则表达式不会匹配任何东西,因为它是。您肯定需要删除引号 -"/"字符就足够了。

/^\s+$/是检查字符串是否是所有空白:

  • ^ 匹配字符串的开头。
  • \s+ 表示至少 1 个,可能更多,空格。
  • $ 匹配字符串的结尾。

尝试用/\s/(并且没有引号)替换正则表达式

test方法是最好的一段路要走。字符类\s检查任何空白字符,包括空格、制表符、回车和换页。

由于我们正在寻找单个匹配项,因此不需要全局标志。正则表达式文字比它们的构造函数等价物运行得更快,因为它们在运行时得到了更好的优化。

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

console.log(hasWhiteSpace("Hello World!"));
console.log(hasWhiteSpace("HelloWorld!"));

console.time('hasWhiteSpace');
for (let i = 0; i < 1_000_000; i++) {
  hasWhiteSpace("Some text here");
}
console.timeEnd('hasWhiteSpace');

如果您仅使用某些空白字符,则可以利用数组方法,例如some在第一次成功匹配时返回,但它们会比正则表达式的测试方法慢:

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

console.log(hasWhiteSpace("Hello World!"));
console.log(hasWhiteSpace("HelloWorld!"));

console.time('hasWhiteSpace');
for (let i = 0; i < 1_000_000; i++) {
  hasWhiteSpace("Some text here");
}
console.timeEnd('hasWhiteSpace');

正如您在性能基准测试中看到的那样,该test方法比some无论如何都不会引起注意方法稍快

其他一些人已经发布了答案。有一些明显的问题,比如它false在正则表达式通过时返回,并且^$运算符指示开始/结束,而问题是寻找有(任何)空格,而不是:只包含空格(正则表达式正在检查)。

除此之外,这个问题只是一个错字。

改变这...

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>

此函数检查其他类型的空格,而不仅仅是空格(制表符、回车符等)

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