正则expression式:什么是InCombiningDiacriticalMarks?

下面的代码是非常有名的将重音字符转换为纯文本:

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

我用这个replace了我的“手工制造”方法,但我需要了解replaceAll的“正则expression式”部分

1)什么是“合并病态标记”?
2)文件在哪里? (和类似的?)

谢谢。

\p{InCombiningDiacriticalMarks}是一个Unicode块属性。 在JDK7中,您可以使用分为两部分的符号\p{Block=CombiningDiacriticalMarks}来编写它,这对读者来说可能更清楚。 它在UAX#44中有记载:“Unicode字符数据库” 。

这意味着代码点在一个特定的范围内,一个块被分配用于这个名字的事物。 这是一个坏的方法,因为不能保证该范围内的代码点是或不是特定的东西,也不能保证该块外的代码点本质上不是相同的字符。

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

块几乎不是你想要的。

在这种情况下,我怀疑你可能想要使用属性\p{Mn} ,又名\p{Nonspacing_Mark} 。 Combining_Diacriticals块中的所有代码点都是这样的。 还有(如Unicode 6.0.0)1087 Nonspacing_Marks 不在该块中。

这与检查\p{Bidi_Class=Nonspacing_Mark}几乎相同,但不完全相同,因为该组还包含封闭标记\p{Me} 。 如果你想同时使用默认的Java正则expression式引擎,那么你可以说[\p{Mn}\p{Me}] ,因为它只允许访问General_Category属性。

您必须使用JNI以像访问\p{BC=NSM}那样的方式访问ICU C ++正则expression式库,因为现在只有ICU和Perl才能访问所有 Unicode属性。 普通的Java正则expression式库仅支持一些标准的Unicode属性。 在JDK7中,虽然支持Unicode Script propery,这对Block属性来说是无限可取的。 因此,您可以在JDK7中写入\p{Script=Latin}\p{SC=Latin} ,或者使用\p{Latin}快捷键来获取拉丁脚本中的任何字符。 这导致非常普遍需要的[\p{Latin}\p{Common}\p{Inherited}]

请注意,这并不会消除所有angular色的“口音”标记。 有很多它不会这样做。 例如,您不能将Đ转换为Dø 。 为此,需要将代码点减less为与Unicode归类表中的主归类强度相同的那些代码点。

\p{Mn}失败的另一个地方显然是包含\p{Me}这样的标记,但是也有\p{Diacritic}字符不是标记。 可悲的是,你需要完全的财产支持,这意味着JNI要么ICU或Perl。 Java有很多与Unicode支持有关的问题,恐怕。

等等,我看你是葡萄牙人。 你应该没有问题,如果你只是在处理葡萄牙文。

但是,我敢打赌,你并不想删除口音,而是希望能够匹配“重音不敏感”的东西,对吗? 如果是这样,那么您可以使用ICU4J(ICU for Java)整理器类来完成 。 如果你比较主要的力量,重音符号将不计算在内。 我一直这样做,因为我经常处理西class牙文本。 我有一个如何做到这一点的西class牙人坐在这里某处的例子,如果你需要它。

花了我一段时间,但我把他们全部吃完了:

这里的正则expression式应该包含所有的zalgo字符,包括在“正常”范围内绕过的字符。

 ([\u0300–\u036F\u1AB0–\u1AFF\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F\u0483-\u0486\u05C7\u0610-\u061A\u0656-\u065F\u0670\u06D6-\u06ED\u0711\u0730-\u073F\u0743-\u074A\u0F18-\u0F19\u0F35\u0F37\u0F72-\u0F73\u0F7A-\u0F81\u0F84\u0e00-\u0eff\uFC5E-\uFC62]) 

希望这可以为你节省一些时间。