【问题标题】:Java regex: search for a string without accent in a text with accentJava regex:在带重音的文本中搜索不带重音的字符串
【发布时间】:2019-03-27 17:29:26
【问题描述】:

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

我要介绍的情况是这样的:假设我的原始文本是以下法语文本(带重音):

démo test

我想知道文本中是否存在单词demo(没有重音),使用正则表达式。问题是:我无法更改原始文本(例如,我不能使用 Normalizer.normalize()),因为我使用的库将正则表达式作为参数。

这是我尝试过的:

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

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

是否有任何正则表达式可以涵盖这种情况?

感谢您的帮助。

【问题讨论】:

  • 该文本不包含没有重音的demo。你的匹配器说它有吗?请在您的问题中包含代码、各种输入案例和预期输出(不是 cmets)。
  • 当文本为démo 或仅当它为demo 时,正则表达式是否应该返回true?
  • @CarlosHeuberger:正则表达式应该告诉我“démo test”和“demo”匹配。
  • 您只处理法语吗?或者您可能有未知数量的带有重音符号的字母?
  • 你必须先规范化文本。 Java 会这样做吗?

标签: java regex


【解决方案1】:

假设您确实无法更改输入文本,则以下工作:

如果您的输入文本是分解的形式,这意味着 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

【讨论】:

    【解决方案2】:

    一种方法是修改正则表达式文字以搜索和替换重音符号
    一个类的字符。

     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 个单独的正则表达式。
    这将是七次全局查找/替换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-12
      • 2023-04-04
      • 2013-01-02
      • 2019-02-05
      • 1970-01-01
      • 1970-01-01
      • 2013-05-16
      • 2015-02-06
      相关资源
      最近更新 更多