如何使用黑名单数组和正则表达式禁止使用变音符号的单词?

Ion*_*ula 10 html javascript regex jquery

我有一个类型文本的输入,我返回true或false取决于被禁止的单词列表.一切正常.我的问题是我不知道如何检查数组中带有变音符号的单词:

var bannedWords = ["bad", "mad", "testing", "b??"];
var regex = new RegExp('\\b' + bannedWords.join("\\b|\\b") + '\\b', 'i');

$(function () {
  $("input").on("change", function () {
    var valid = !regex.test(this.value);
    alert(valid);
  });
});
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type='text' name='word_to_check'>
Run Code Online (Sandbox Code Playgroud)

现在在单词上b??它返回true而不是false,例如.

myf*_*myf 5

Chiu的评论是正确的:'aaáaa'.match(/\b.+?\b/g)yelds非常反直觉[ "aa", "á", "aa" ],因为\wJavaScript正则表达式中的"word character"()只是 [A-Za-z0-9_]('case-insensitive-alpha-numeric-and-underscore')的简写,所以word boundary(\b)匹配任何放在alpha-numerics和任何其他角色之间.这使得提取"Unicode单词"非常困难.

对于非单词编写系统,可以通过其双重性质识别"单词字符":ch.toUpperCase() != ch.toLowerCase()所以您的修改后的代码段可能如下所示:

var bannedWords = ["bad", "mad", "testing", "b??", "ba?"];
var bannedWordsRegex = new RegExp('-' + bannedWords.join("-|-") + '-', 'i');

$(function() {
  $("input").on("input", function() {
    var invalid = bannedWordsRegex.test(dashPaddedWords(this.value));
    $('#log').html(invalid ? 'bad' : 'good');
  });
  $("input").trigger("input").focus();

  function dashPaddedWords(str) {
    return '-' + str.replace(/./g, wordCharOrDash) + '-';
  };

  function wordCharOrDash(ch) {
    return isWordChar(ch) ? ch : '-'
  };

  function isWordChar(ch) {
    return ch.toUpperCase() != ch.toLowerCase();
  };
});
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type='text' name='word_to_check' value="ba">
<p id="log"></p>
Run Code Online (Sandbox Code Playgroud)