我正在尝试制作一个 Java 正则表达式,以使用 Pattern.split() 将通用格式“foo - bar”的字符串拆分为“foo”和“bar”。 “-”字符可能是几个破折号之一:ASCII“-”、em-dash、en-dash 等。我构建了以下正则表达式:
private static final Pattern titleSegmentSeparator = Pattern.compile("\\s(\\x45|\\u8211|\\u8212|\\u8213|\\u8214)\\s");
如果我正确阅读模式文档,当两边都被空格包围时,应该捕获任何 unicode 破折号或 ascii 破折号。我使用的模式如下:
String[] sectionSegments = titleSegmentSeparator.split(sectionTitle);
没有快乐。对于下面的示例输入,未检测到破折号,并且 titleSegmentSeparator.matcher(sectionTitle).find() 返回 false!
为了确保我没有遗漏任何不寻常的字符实体,我使用 System.out 打印了一些调试信息。输出如下——每个字符后面都是(int)char的输出,应该是它的unicode码位吧?
示例输入:
Study Summary (1 of 10) – Competition
S(83)t(116)u(117)d(100)y(121) (32)S(83)u(117)m(109)m(109)a(97)r(114)y(121) (32)((40)1(49) (32)o(111)f(102) (32)1(49)0(48))(41) (32)–(8211) (32)C(67)o(111)m(109)p(112)e(101)t(116)i(105)t(116)i(105)o(111)n(110)
在我看来,破折号是代码点 8211,它应该与正则表达式匹配,但事实并非如此!这是怎么回事?
最佳答案
您混合了十进制 (8211
) 和十六进制 (0x8211
)。
\x
和 \u
都需要一个十六进制数,因此您需要使用 \u2014
来匹配 em-dash ,而不是 \u8211
(和 \x2D
用于普通连字符等)。
但为什么不简单地使用 Unicode 属性“Dash punctuation”呢?
作为 Java 字符串:"\\s\\p{Pd}\\s"
关于java - 在 Java 正则表达式中匹配 Unicode 破折号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3045511/