Jac*_*ack 13

我认为你能做的最好的事情就是使用一个规范化器,它将带有重音的unicode字符分成两个独立的字符.Java在课堂上包含了这个Normalizer,请看这里.

例如,这将分裂

U+00C1    LATIN CAPITAL LETTER A WITH ACUTE
Run Code Online (Sandbox Code Playgroud)

U+0041    LATIN CAPITAL LETTER A
U+0301    COMBINING ACUTE ACCENT
Run Code Online (Sandbox Code Playgroud)

并且会为每个具有重音或其他变音符号的角色(http://en.wikipedia.org/wiki/Diacritic)执行此操作.

然后你可以检查结果CharSequence是否有一些重音字符(这意味着硬编码)或者只是检查标准化版本是否等于起始版本,这意味着没有任何字符被分解.Java Normalizer已经有了这个功能isNormalized(CharSequence src, Normalizer.Form form),但你应该查看各种可用表格,看看是否有适合你需求的表格.

编辑:如果你只需要基本的重音支持(比如èéàòù)你可以选择oedo选项,如果你需要全部支持所有现有的口音,那么对它们进行硬编码会很疯狂.

  • 如果你在\ p {Mn}上匹配,我认为你将能够过滤掉所有组合标记(它是标记,非间距的一般类别). (3认同)

chr*_*ris 5

if (Pattern.matches(".*[éèàù].*", input)) {
  ....
}
Run Code Online (Sandbox Code Playgroud)

将您想要的任何重音添加到该列表中


tch*_*ist 5

正确的方法是使用normalize(str,NFD)from java.text.Normalizer,然后删除一般类别Mark \pM或Non-Spacing Mark 的字符\p{Mn}.Java不支持标准的Unicode属性\p{Diacritic},也可以使用它.请注意,并非所有变音符号都是非间距标记,反之亦然.

但是,这可能是错误的做法.如果您尝试进行不区分重音的字符串搜索和比较,正确的方法是将字符串保留原样.您需要创建一个UCA归类对象,其级别设置为1(或者更确切地说是PRIMARY),然后使用它来比较您的字符串.如果字符串在主要强度上比较相等,则忽略重音符号等内容.

下面是 Java中使用ICU的Collat​​or类如何做到这一点的例子.如果你正在使用合适的UCA训练器,那么你就不必进行正常化; 他们为你照顾这个.

Perl中的这个答案使用两个UCA collat​​or对象,一个主要强度完全忽略字符串搜索和比较的重音,另一个允许在二次强度下区分变音符号,这是Unicode的正常情况.