口音不敏感的正则表达式

Posted

技术标签:

【中文标题】口音不敏感的正则表达式【英文标题】:accent insensitive regex 【发布时间】:2011-05-14 18:54:42 【问题描述】:

我的代码:

jQuery.fn.extend(
 highlight: function(search)
  var regex = new RegExp('(<[^>]*>)|('+ search.replace(/[.+]i/,"$0") +')','ig');

  return this.html(this.html().replace(regex, function(a, b, c)
   return (a.charAt(0) == '<') ? a : '<strong class="highlight">' + c + '</strong>';
  ));
 

);

我想突出显示带有重音符号的字母, 即:

$('body').highlight("cao");

应该突出显示:[ção] OR [ção] OR [cáo] OR expre[cão]tion OR [Cáo]tion

我该怎么做?

【问题讨论】:

【参考方案1】:

唯一正确的方法是首先通过 Unicode 规范化表单 D 运行它,规范分解。

然后您剥离我们产生的任何标记(\pM 字符,或者可能是 \pDiacritic,取决于),并针对 de/un-marked 版本运行您的匹配。

在任何情况下都不要硬编码一堆文字。哎呀!

Boa sorte!

【讨论】:

我该怎么做?这是一半的答案,只是指向解决方案!【参考方案2】:

您需要提供一个替代字符表,并根据该表动态生成一个正则表达式。例如:

var alt = 
  'c': '[cCç]',
  'a': '[aAãÃá]',
  /* etc. */
;

highlight: function (search) 
  var pattern = '';
  for (var i = 0; i < search.length; i++) 
    var ch = search[i];
    if (alt.hasOwnProperty(ch))
      pattern += alt[ch];
    else
      pattern += ch;
  

  ...

那么对于search = 'cao',这将生成一个模式[cCç][aAãÃá]o

【讨论】:

以上是关于口音不敏感的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

用于输入验证的正则表达式白名单 - 不区分重音

正则表达式判断是不是包含敏感字符

过滤敏感词-正则表达式

Oracle 正则表达式函数-REGEXP_LIKE 使用例子

Oracle 正则表达式函数-REGEXP_SUBSTR 使用例子

Oracle 正则表达式函数-REGEXP_REPLACE 使用例子