正则表达式查找文本中某个字符的所有变体

时间:2011-03-03 10:33:11

标签: java regex

我试图在文本中找到用户输入字符的unicode变体以突出显示它们。例如。如果用户输入“Beyonce”,我想在文本中突出显示所有带有“Beyoncé”或“Beyônce”或“Bèyönce”等变体的文本。当前我唯一的想法是通过用一组替换输入字符串来创建正则表达式像这样的角色组:

"Beyonce" => "B[eêéè]y[óòôö]c[éèê]"

但这似乎是一种非常繁琐且容易出错的方式。我基本上寻找的是一个正则表达式字符组,它匹配给定输入字符的所有变体,类似于\ p {M},但可以指定基本字母。在java正则表达式中有这样的东西吗?如果没有,那么如何改进正则表达式创建过程?我不认为手动指定所有变体将在长期内起作用。

1 个答案:

答案 0 :(得分:2)

有几种方法,可以表示重音字符。在java.text.Normalizer的javadoc中有一个很好的例子:

For example, take the character A-acute. In Unicode, this can be encoded
as a single character (the "composed" form):

  U+00C1    LATIN CAPITAL LETTER A WITH ACUTE

or as two separate characters (the "decomposed" form):

  U+0041    LATIN CAPITAL LETTER A
  U+0301    COMBINING ACUTE ACCENT 

第二种形式可以让访问非强调角色相对容易,幸运的是,Normalizer可以帮助你:

Normalizer.normalize(text, Form.NFD); // NFD = "Canonical decomposition"

然后,您可以使用正则表达式忽略(或删除)字符串中的任何非ASCII字符,具体取决于:

[^\p{ASCII}]