口音不敏感的正则表达式
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 使用例子