当前位置: 首页 > 面试题库 >

正则表达式:什么是InCombiningDiacriticalMarks?

壤驷凯
2023-03-14
问题内容

以下代码是众所周知的将重音符转换为纯文本的代码:

Normalizer.normalize(text, Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+", "");

我用这种方法代替了“手工制作”方法,但是我需要了解replaceAll的“ regex”部分

1)什么是“ InCombiningDiacriticalMarks”?
2)它的文档在哪里?(和类似的?)

谢谢。


问题答案:

\p{InCombiningDiacriticalMarks}是Unicode块属性。在JDK7中,您将可以使用两部分表示法来编写它\p{Block=CombiningDiacriticalMarks},这对于读者来说可能更清楚。它在UAX#44:“
Unicode字符数据库”中进行了记录

这意味着代码点落入了一个特定范围内,即一个块,该块已被分配用于该名称的事物。这是一种不好的方法,因为不能保证该范围内的代码点是否为任何特定事物,也不能保证该块之外的代码点实质上不是同一字符。

例如,该\p{Latin_1_Supplement}块中有拉丁字母,例如é,U + 00E9。但是,有些东西 也不是
拉丁字母。当然,到处都有拉丁字母。

积木几乎从来都不是您想要的。

在这种情况下,我怀疑您可能想使用\p{Mn}aka
属性\p{Nonspacing_Mark}。Combining_Diacriticals块中的所有代码点均属于此类。从Unicode
6.0.0开始,还有1087 Nonspacing_Marks 不在 该块中。

这几乎与检查相同\p{Bidi_Class=Nonspacing_Mark},但不完全相同,因为该组还包含了封闭标记\p{Me}。如果两者都需要,则可以说[\p{Mn}\p{Me}]是否使用默认的Java
regex引擎,因为它仅提供对General_Category属性的访问。

您必须像Google一样使用JNI来获取ICU C ++ regex库,以便访问像之类的东西\p{BC=NSM},因为现在只有ICU和Perl允许访问
所有 Unicode属性。普通的Java regex库仅支持几个标准Unicode属性。不过,在JDK7 中将
支持Unicode脚本属性,这几乎绝对优于Block属性。因此,您可以在JDK7中编写\p{Script=Latin}
\p{SC=Latin}或快捷方式\p{Latin},以从拉丁脚本中获取任何字符。这导致了 非常
普遍的需要[\p{Latin}\p{Common}\p{Inherited}]

请注意,这不会删除您可能会想到的所有字符中的“重音”标记!有很多它不会这样做的。例如,您无法将 Đ 转换为 D 或将 ø 转换为
o 。为此,您需要将代码点减少为与Unicode归类表中的主归类强度相同的那些。

\p{Mn}当然,失败的另一个地方当然是包含诸如的标记\p{Me},但也有\p{Diacritic}一些不是标记的字符。可悲的是,您需要为此提供完整的属性支持,这意味着JNI是ICU还是Perl。恐怕Java在Unicode支持方面存在很多问题。

哦,等等,我看到你是葡萄牙语。如果您只处理葡萄牙语,那么您应该没有任何问题。

但是,我敢打赌,您并不是真的想删除重音符号,而是希望能够“不区分重音符号”来匹配内容,对吗?如果是这样,则可以使用ICU4J(Java的ICU)整理程序类进行操作。如果您以主要强度进行比较,则重音符号将不会计入。我一直这样做,因为我经常处理西班牙语文本。我有一个示例,说明如何在需要时坐在这里的西班牙人。



 类似资料:
  • 问题内容: 我在以下正则表达式中找到了它: 它将方括号(及其内容)与嵌套方括号匹配。 问题答案: 是一个字符类,表示除和以外的所有字符。 您可以避免转义和特殊字符,因为它对于PCRE(函数中使用的正则表达式引擎)不是模棱两可的。 由于在PCRE中不正确,因此正则表达式解析的唯一方法是在字符类内部,该字符类稍后将关闭。与以下相同。它不能重新打开字符类内的字符类(POSIX字符类除外)。然后最后一个清

  • 问题内容: 我正在尝试匹配\ ^ c形式的控制字符,其中c是控制字符的任何有效字符。我有这个正则表达式,但目前无法使用: 我认为问题在于,插入符号(^)是正则表达式解析引擎的一部分。 问题答案: 使用pattern 匹配形式的ASCII文本字符串,仅此而已。将形式的ASCII文本字符串与模式匹配。你不妨约束点缀到,所以。对于方括号字符类而言,它更容易阅读,因此对于原义BACKSLASH,其后是原义

  • 问题内容: 从Java 6 模式文档中: 特殊构造(非捕获) X X ,作为非捕获组 … X X ,作为独立的非捕获组 之间和有什么区别?在这种情况下, 独立 意味着什么? 问题答案: 这意味着分组是原子的,它会丢弃匹配组的回溯信息。因此,该表达式是所有格;即使这样做是正则表达式整体成功的唯一途径,它也不会退缩。它是“独立的”,即它不会通过回溯与正则表达式的其他元素协作来确保匹配。

  • 和?我试着在谷歌上搜索,但没有成功。

  • 11.1 开始之前:什么是正则表达式 约略了解了 Linux 的基本指令 (BASH) 并且熟悉了 vim 之后,相信你对于敲击键盘的打字与指令下达比较不陌生了吧? 接下来,下面要开始介绍一个很重要的观念,那就是所谓的“正则表达式 (Regular Expression)”啰! 什么是正则表达式 任何一个有经验的系统管理员,都会告诉你:“正则表达式真是挺重要的!” 为什么很重要呢?因为日常生活就使

  • 问题内容: 非捕获组(即)在正则表达式中如何使用?它们有什么用? 问题答案: 让我尝试用一​​个例子来解释。 现在,如果我将下面的正则表达式应用于它… …我将得到以下结果: 但我不在乎协议-我只想要URL的主机和路径。因此,我将正则表达式更改为包括非捕获组(?:)。 现在,我的结果如下所示: 看到?第一组尚未被捕获。解析器使用它来匹配文本,但是稍后在最终结果中将其忽略。 编辑: 根据要求,我也尝试