Java 正则表达式匹配拉丁字母对应字符的变音符号

标签 java regex nlp diacritics

我正在尝试使用诸如 [ăâîşşĂÂÎşş] 之类的正则表达式来匹配罗马尼亚字母变音符号 (ISO 8859-16/Windows-1250)。问题是正则表达式也会匹配 a,i,s,t,A,I,S,T(上述变音符号的拉丁字母对应字符)的正则表达式,我不希望这样。 由于性能时间的原因,我没有尝试逐个字符地比较字符串。

我是否可以使正则表达式与这些字符完全匹配?

最佳答案

如果您的正则表达式以文字呈现的文本形式存在,则它已经被组合
并且应该作为不同的代码点存在。

000074    t    LATIN SMALL LETTER T
+
000326    ̦    COMBINING COMMA BELOW
=
00021B    ț    LATIN SMALL LETTER T WITH COMMA BELOW

以防万一,您应该使用十六进制代码点来表示它们,即。 u\021B

Java 引擎是否有可能从正则表达式中剥离组合字符?
x21B 哪里变成 x74 了?可能就是这样。

同时,如果您希望源中的字母不会呈现,您可以
使用像 \p{Script=Latin}\p{Block=Combining_Diaritic_Marks}
这样的正则表达式 得到那些。

更新信息:
在寻找事实上的解决方案时,我遇到了这个 Java 信息​​
来自http://www.regular-expressions.info/unicode.html

In Java, the regex token \uFFFF only matches the specified code point, even when you turned on canonical equivalence. However, the same syntax \uFFFF is also used to insert Unicode characters into literal strings in the Java source code. Pattern.compile("\u00E0") will match both the single-code-point and double-code-point encodings of à, while Pattern.compile("\u00E0") matches only the single-code-point version. Remember that when writing a regex as a Java string literal, backslashes must be escaped. The former Java code compiles the regex à, while the latter compiles \u00E0. Depending on what you're doing, the difference may be significant.

因此,通过在类中输入对偶文字,它看起来像 Pattern.compile("[à]")
实际上会匹配

000061    a    LATIN SMALL LETTER A
or
000300    ̀    COMBINING GRAVE ACCENT
or
0000E0    à    LATIN SMALL LETTER A WITH GRAVE  

将代理对放入类中时,这与同样的问题有关。
有一个解决方案。

避免在类中输入这些文字。
相反,将它们作为一系列交替
(?:à|_|_|_)

这样做会强制它匹配任一

000061    a    LATIN SMALL LETTER A
000300    ̀    COMBINING GRAVE ACCENT

0000E0    à    LATIN SMALL LETTER A WITH GRAVE  

它不会像您现在看到的那样与独立于坟墓a匹配。

注意 - 如果您只使用“[\\u00E0]”,您会错过a + 坟墓
这是有效的。

关于Java 正则表达式匹配拉丁字母对应字符的变音符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42213800/

相关文章:

java - 创建抽象 Activity 类

java - 如何获取与这些字符串匹配的正则表达式

java - Stanford Core NLP - 理解共指消解

data-structures - 哈希中的高效模糊查找

java - 模拟Mvc。 VewResolver 工作后检查 url?

java - 如何构造 XSD 以在生成的 JAXB 类中使用原始包装器而不是原始类型?

java - javaFX 中的 ArrayIndexOutOfBoundsException

php - Rust regex replace_all 比 PHP regex preg_replace_callback 慢,如何优化?

javascript - JavaScript Regex花括号

nlp - 使用 Spacy 查找俄语引理(那些没有模型的语言)