Java正则表达式:在带有重音符号的文本中搜索不带重音符号的字符串

时间:2019-03-27 17:29:27

标签: java regex

在我的Java应用程序中,我想使用一个正则表达式来知道文本中是否存在字符串。

我要介绍的情况是这种情况:假设我的原始文字是以下法语文字(带有重音符号):

démo test

我想使用正则表达式了解文本中是否存在单词demo(无重音)。关键是:我无法更改原始文本(例如,我不能使用Normalizer.normalize(),因为我正在使用以正则表达式作为参数的库。

这是我尝试过的:

  • 如果我使用"(?i)démo",则有一个匹配项(因为存在démo
  • 如果我使用"(?i)demo",则没有匹配项,但我也想在这里进行匹配。我希望正则表达式对重音不敏感。

到目前为止,我还没有找到可以涵盖该特定情况的正则表达式。

有没有可以解决这种情况的正则表达式?

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

假设您确实无法更改输入文本,则可以执行以下操作:

如果输入文本采用分解形式,则意味着démo由unicode码点d e COMBINING ACUTE ACCENT m o组成,您可以选择匹配重音:

de\pM?mo

其中\pM描述unicode属性"Mark"。这将匹配所有标记。如果您只关心确切的口音,也可以选择直接匹配\u0301

如果您的文本采用组成格式,则意味着démo由Unicode代码点d LATIN SMALL LETTER E WITH ACUTE m o组成,您只需要在正则表达式中手动进行匹配:

d(e|é)mo

答案 1 :(得分:0)

一种方法是修改regex文字以搜索并替换带重音符号的
带有类的字符。

 Regex string           Replace string
---------------------------------------------
Find any one          Replace with this lieral:
of these:

 [aâàä]         ->       [aâàä]
 [cç]           ->       [cç]
 [eéèêë]        ->       [eéèêë]
 [iîï]          ->       [iîï]
 [oô]           ->       [oô]
 [uùûü]         ->       [uùûü]
 [?œ]           ->       ????

这需要在搜索字符串上运行7个独立的正则表达式。
这将是全局查找/替换操作,共七次。