【问题标题】:Regexp with accented characters on match [duplicate]匹配时带有重音字符的正则表达式[重复]
【发布时间】:2015-07-22 23:01:42
【问题描述】:

当用户尝试验证时,我必须检查文本区域中的禁用词。 禁用词列表存储在jsBlackList 数组中,这是我到目前为止的代码的一部分:

var fieldValue = value;
var hasForbiddenWord = false;
for (i = 0; i < jsBlackList.length; i++) {
    var regex = new RegExp("\\b"+jsBlackList[i]+"\\b","gi");
    fieldValue = fieldValue.replace(regex, '***');
    hasForbiddenWord = hasForbiddenWord || fieldValue.match(regex);
}
value = fieldValue;

但问题是,jsBlackList 有一些重音字符,而用户可以不带重音书写(例如,jsBlackList 可以有“déjà”,而用户输入了“deja”、“déja”或“dejà” )。

如何检查缺失的重音符号?

关于“标记为重复”的注意:重复的问题是关于“不带重音的正则表达式来检查带有重音的文本”,我的是“带有重音的正则表达式来检查可能缺少重音的文本”。

【问题讨论】:

  • 你可以试试这个:d[ée]j[àa]

标签: javascript regex


【解决方案1】:

实现此目的的一种方法是稍微更改您的黑名单:

用重音符号替换所有字符。

例如:"déjà" 到:"d(é|e)j(à|a)"

如果您的黑名单很大,那么您可能希望自动执行此替换,但最后将黑名单写成这样很方便。

【讨论】:

  • 字符类更适合这个 - d[ée]j[àa]
  • 最后我用的是这个。不得不重做黑名单,但我认为这是最好的解决方案。
  • 字符类也很好。可读性偏好可能会决定。
【解决方案2】:

您需要创建一个等价列表并在您的正则表达式或所有等价中:

dé|ejà|a

【讨论】:

    【解决方案3】:

    我认为你最好的选择是:

    • 删除黑名单中的所有重音字符,
    • 处理文本以将重音字符替换为其非重音字符

    然后你就可以不用重音来比较了。

    【讨论】:

    • 这将是简单的方法,但正如您所见,我必须将匹配的禁止字符替换为三倍 *。如果我按照您的解释进行操作,则仅更改匹配的单词会更困难,否则文本需要保留他的重音字符。
    猜你喜欢
    • 2015-07-27
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 2013-07-03
    • 2011-09-14
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多