regex 确定字符串是否为“空”

2cmtqfgy  于 2023-01-27  发布在  其他
关注(0)|答案(8)|浏览(260)

我需要一个JavaScript函数来告诉我一个字符串对象是否为空。所谓“空”,我的意思是它不仅仅是空白字符。我写了这个原型:

String.prototype.isEmpty = function() {
  return this.length === 0 || this === " " || this.test(/^\s*$/);
}

这样可以吗?
有没有性能更好的版本?

zazmityj

zazmityj1#

用途

String.prototype.isEmpty = function() {  
  if (!this.match(/\S/)) {
    return ('enter some valid input.Empty space is not allowed');
  } else {
   return "correct input";
  }
}

alert("test 1:"+("    ".isEmpty()));
alert("test 2:"+("   \t ".isEmpty()));
alert("test 3:"+("  \n   ".isEmpty()));
alert("test 4:"+("hi".isEmpty()));

注:
\s将匹配空白字符:空格、制表符或换行符。
\S将匹配非空白字符:除空格、制表符或换行符以外的任何字符。如果字符串中有一个非空格、制表符或换行符的字符,则该字符串不为空。因此,您只需搜索一个字符:\S

bgibtngc

bgibtngc2#

看起来您需要使用/^\s*$/.test(this)而不是this.test(/^\s*$/)strings没有test()方法,除非您使用实现此方法的JavaScript库。
/^\s*$/.test(this)已经足够了,但是如果前两个表达式中的任何一个计算为true,那么前两个表达式就会短路,而不必测试正则表达式,这应该是非常有效的。
正如@Matthew Crumley在上面的注解中所指出的,您的this === " "表达式将始终计算为false。您可以删除此表达式,或者如果您希望有许多字符串只有一个空格字符,则使用==

String.prototype.isEmpty = function() {
  return this.length === 0 || this == " " || /^\s*$/.test(this);
}
rryofs0p

rryofs0p3#

String.prototype.isEmpty = function() {
  return this.length == 0 || /^\s*$/.test(this);
}

在255种可能性中(不考虑代码大于255的Unicode字符),长度为1的字符串包含空格字符,考虑长度大于1的字符串,这种可能性甚至更低。

z18hc3ub

z18hc3ub4#

通常,使用RegExp.prototype.test检查模式匹配而不编译匹配的返回数组(String.prototype.match)可能会有更好的性能。

function isEmpty() {

     var string = arguments[0] ;
     var EMPTY_STRING_PATTERN = /^\s*$/ , empty = false ;

     if( EMPTY_STRING_PATTERN.exec(string) === true ) empty = true ;

     return empty ;

}

顺便说一句,摆弄核心javascript对象的prototype对象被认为是不好的做法。

disbfnqx

disbfnqx5#

来自示例https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/Trim

var orig="   foo  "
document.write(orig.trim())  // foo

document.write(orig.trim().length) // 3

在FF 3.6.8、Safari 5.0.1、谷歌浏览器5.0.375.127上测试,但在IE 8上产生js错误

lp0sw83n

lp0sw83n6#

我摆弄了一些东西:

  • 我返回的是这个长度的倒数,对于0是true,对于所有其他的数字是false
  • 我删除了对" "的检查。实际上我还没有看到太多,如果任何情况下,一个单一的空间被输入,删除检查是海事组织的平均速度更快。
  • 像<->其他人一样翻转正则表达式。

String.prototype.isEmpty = function() {
return !this.length || /^\s*$/.test(this);
}

bttbmeg0

bttbmeg07#

答案与最初以示例形式提供的Daniel Vassallo相同。

String.prototype.isEmpty = function() {
    return /^\s*$/.test(this);
}
document.body.style="background-color:black; color:green;font-size:12pt;font-family: 'Courier New', monospace;font-weight: bold";
String.prototype.isEmpty = function() {
     return /^\s*$/.test(this);
}
let test0 = ''.isEmpty();
let test1 = '\xa0'.isEmpty();
let test2 = ' '.isEmpty();
let test3 = '\t'.isEmpty();
let test4 = '\n'.isEmpty();
let test5 = '\n\n'.isEmpty();
let test6 = '\n\t\n'.isEmpty();
let test7 = '\r\n'.isEmpty();
let test8 = '\r\t\n'.isEmpty();
let test9 = '\r\n\t'.isEmpty();

var texts = new Array(
     ("String.prototype.isEmpty = function() {"), 
     ("     return /^\s*$/.test(this);"), 
     ("}"), 
     (""), 
     ("let test0 = ''.isEmpty()       // " + test1), 
     ("let test1 = ' '.isEmpty()      // " + test2) + " (non breaking space)", 
     ("let test2 = ' '.isEmpty()      // " + test2), 
     ("let test3 = '\\t'.isEmpty()     // " + test3), 
     ("let test4 = '\\n'.isEmpty()     // " + test4), 
     ("let test5 = '\\n\\n'.isEmpty()   // " + test5), 
     ("let test6 = '\\n\\t\\n'.isEmpty() // " + test6), 
     ("let test7 = '\\r\\n'.isEmpty()   // " + test7), 
     ("let test8 = '\\r\\t\\n'.isEmpty() // " + test8),
     ("let test9 = '\\r\\n\\t'.isEmpty() // " + test9)
);
texts.forEach(text => {
  let nobreakchar = '\xa0'
  ;
  document.body.append(document.createTextNode(text.replaceAll(" ",nobreakchar)))
  document.body.append(document.createElement("br"))
});
62lalag4

62lalag48#

不要写太多的行,让我们只用2行就完成了。

String.prototype.isEmpty = function () {
    return this.length === 0 || this.trim() === ""
}

使用trim(),您不必担心变量是否只有空格字符,这也是您如何避免落入regex的原因

相关问题