如果您的正则表达式作为文字呈现的文本存在,则它已经被合并
并且应该作为不同的代码点存在。
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_Diacritical_Marks}这样的正则表达式
得到那些。
更新信息:
在寻找事实上的解决方案时,我遇到了这个 Java 信息
来自http://www.regular-expressions.info/unicode.html。
在 Java 中,正则表达式标记 \uFFFF 仅匹配指定的
代码点,即使您打开规范等价。
但是,同样的语法 \uFFFF 也用于插入
Unicode 字符转换为 Java 源代码中的文字字符串
代码。 Pattern.compile("\u00E0") 将匹配
à的单码点和双码点编码,
而 Pattern.compile("\u00E0") 只匹配
单码点版本。请记住,在编写
正则表达式作为 Java 字符串文字,必须转义反斜杠。
前一个 Java 代码编译正则表达式 à,而后者
编译\u00E0。取决于你在做什么,
差异可能很大。
因此,通过在类中输入对偶文字,它看起来像 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
它不会像您现在看到的那样独立于 grave 匹配 a。
注意 - 如果你只使用“[\\u00E0]”,你会错过a + grave。
这是有效的。