如果字符串与正则表达式 JavaScript 不匹配,则返回 True

Return True if a string doesn't match regex javascript

本文关键字:返回 True 不匹配 JavaScript 字符串 正则表达式 如果      更新时间:2023-09-26

我正在尝试编写一个函数来确定输入是否在"喊叫"。听到的意思是用所有大写字母书写。我使用的逻辑是

if (this.toUpperCase() === this) 

这工作得很好,但是,我遇到的问题是严格的数字或符号(?, !等)字符串被标记为喊叫。

我已经尝试了一些东西,大意是

if (this.toUpperCase() === this && !this.match(/a-zA-Z/))

然而,这似乎并不能解决问题。错误在于我的 JavaScript 还是我的正则表达式?提前感谢任何帮助!

你的第二个条件是错误的:你正在检查一个不包含字母(大写或小写)的字符串。而且您忘记了正则表达式中的方括号。您应该检查至少包含一个大写字母的字符串:

if ((this.toUpperCase() === this) && (this.match(/[A-Z]/)))

你可以做这样的事情:

var str = this;
var R = function(regex) {
    return (str.match(regex) || []).length
};
var ratio = {
    upper: R(/[A-Z]/g),
    lower: R(/[a-z]/g),
    letters: R(/[A-Z]/gi),
    spaces: R(/'s/g),
    non_letters: R(/[^A-Z]/gi)
};

然后你可以使用一些逻辑,比如:

// if only upper case letters
if (this.length == ratio.upper + ratio.spaces)
    // do something ..

希望对您有所帮助。

我认为Fabius的答案是你要找的,但我建议对逻辑进行一些更改,因为您最终可能会捕获更多而不是您想要的全部内容:

  • 这是在喊!!
  • Y?
  • 上面是喊吗?
  • 请使用 SSCCE。
  • 对此
  • 有何看法?这是在喊吗?

以下是我的建议:

var resultsDiv = $('#results'),
    tests = [
      { string: 'THIS IS SHOUTING!!' },
      { string: 'Y?' },
      { string: 'is the above SHOUTING?' },
      { string: 'Please use SSCCE.' },
      { string: 'wHAT ABOUT THIS? IS THIS SHOUTING?' }
    ];
$.each( tests, function(i, test){
  var string = test.string,
      isShouting;
  
  // First, strip out non-alpha characters:
  string = string.replace(/[^a-z]/ig, '');
  
  var beforeLength = string.length;
  
  // Now remove all uppercase characters:
  string = string.replace(/[^A-Z]/g, '');
  
  var afterLength = string.length;
  
  // Now, compare the length of the before and after, with a threshold for short string.
  // Basically, if the before string is at least 4 characters long and more than half of
  // the string is uppercase, then flag it as "shouting".
  isShouting =
    ( beforeLength >= 4 && ( afterLength / beforeLength >= 0.50 ) );
  
  $('<div>')
    .text(test.string)
    .css('color', 'darkblue')
    .appendTo( resultsDiv );
  
  $('<div>')
    .text(isShouting ? "SHOUTING DETECTED!" : "quiet and controlled.")
    .css('margin-bottom', '15px')
    .css('color', isShouting ? 'red' : 'black')
    .appendTo( resultsDiv );
  
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="results">
</div>

您可以摆弄阈值以找到符合您期望的内容。 50% 大写可能过于严格。请记住,任何规则总会有例外,因此请确保"大喊大叫"的后果不会太繁重。

另请注意,我没有做太多工作来国际化此示例。我把它留给读者练习。上面的例子足以证明这个理论。

您正在询问正则表达式,但您最初的示例没有使用它,因此听起来您要使用正则表达式只是为了掩盖第一个示例中的错误。

你不需要正则表达式来做你想做的事情。

如果字符串可以容纳非字母字符,但字母需要全部大写,请尝试

if (this.toLowerCase() !== this)

支持您可能想要的国际化

if (this.toLocaleLowerCase() !== this)

某些语言有不同的大小写规则,如文档 toLacleLowerCase() 文档中所述