我正在尝试制作一个 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");
如果我正确阅读了 Pattern 文档,当两边都被空格包围时,它应该捕获任何 unicode 破折号或 ascii 破折号。我使用的模式如下:
String[] sectionSegments = titleSegmentSeparator.split(sectionTitle);
没有喜悦。对于下面的示例输入,没有检测到破折号,并且 titleSegmentSeparator.matcher(sectionTitle).find() 返回 false!
为了确保没有遗漏任何不寻常的字符实体,我使用 System.out 打印了一些调试信息。输出如下——每个字符后面跟着 (int)char 的输出,应该是它的 unicode 代码点,不是吗?
样本输入:
学习总结(10 篇中的 1 篇)– 竞赛
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,它应该与正则表达式匹配,但事实并非如此!这里发生了什么?