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

Jan*_*omä 5 java regex

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

"Beyonce" => "B[eêéè]y[óòôö]c[éèê]"
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*her 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 
Run Code Online (Sandbox Code Playgroud)

第二种形式可以相对容易地访问非重音字符,幸运的是 Normalizer 可以在这里帮助您:

Normalizer.normalize(text, Form.NFD); // NFD = "Canonical decomposition"
Run Code Online (Sandbox Code Playgroud)

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

[^\p{ASCII}]
Run Code Online (Sandbox Code Playgroud)