首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Regex:什么是InCombiningDiacriticalMarks?

Regex:什么是InCombiningDiacriticalMarks?
EN

Stack Overflow用户
提问于 2011-04-18 07:26:02
回答 2查看 37.9K关注 0票数 90

下面的代码可以将带重音的字符转换为纯文本:

代码语言:javascript
运行
复制
Normalizer.normalize(text, Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+", "");

我用这个方法替换了我的“手工”方法,但是我需要理解replaceAll的“正则表达式”部分。

1)什么是InCombiningDiacriticalMarks?

2)它的文档在哪里?(还有相似的?)

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-18 09:00:27

\p{InCombiningDiacriticalMarks}是Unicode块属性。在JDK7中,您将能够使用由两部分组成的表示法\p{Block=CombiningDiacriticalMarks}来编写它,这对于读者来说可能更清晰。它记录在here in UAX#44: “The Unicode Character Database”中。

它的意思是代码点落在一个特定的范围内,一个块,已经被分配用于使用该名称的东西。这是一种糟糕的方法,因为不能保证该范围内的代码点是或不是任何特定的东西,也不能保证该块外的代码点本质上不是相同的字符。

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

块几乎从来都不是你想要的。

在这种情况下,我怀疑您可能想要使用属性\p{Mn},也就是。\p{Nonspacing_Mark}。Combining_Diacriticals块中的所有代码点都属于这种类型。还有(从Unicode6.0.0开始) 1087个Nonspacing_Marks不在该块中。

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

为了访问像\p{BC=NSM}这样的东西,你必须使用JNI来访问ICU库,因为现在只有ICU和Perl提供对所有C++属性的访问。普通的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}字符。遗憾的是,您需要完整的属性支持,这意味着对ICU或Perl的JNI。恐怕Java在Unicode支持方面有很多问题。

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

然而,我敢打赌,你并不是真的想去除重音,而是希望能够“不敏感地”匹配重音,对吧?如果是这样,那么您可以使用ICU4J (ICU for Java) collator class来执行此操作。如果你比较一下主强度,重音标记就不算数了。我一直这样做,因为我经常处理西班牙语文本。我有一个例子,如果你需要的话,我有一个西班牙语的例子。

票数 78
EN

Stack Overflow用户

发布于 2016-03-31 18:52:36

我花了一段时间,但我把它们都钓出来了:

应该包括所有zalgo字符的Here's regex,包括在“正常”范围内绕过的字符。

代码语言:javascript
运行
复制
([\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])

希望这能节省你的时间。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5697171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档