7

我正在尝试制作一个 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,它应该与正则表达式匹配,但事实并非如此!这里发生了什么?

4

1 回答 1

13

您正在混合十进制 ( 8211) 和十六进制 ( 0x8211)。

\x并且\u两者都需要一个十六进制数字,因此您需要使用\u2014来匹配 em-dash,而不是\u8211(以及\x2D正常的连字符等)。

但是为什么不简单地使用 Unicode 属性“Dash punctuation”呢?

作为 Java 字符串:"\\s\\p{Pd}\\s"

于 2010-06-15T13:37:43.530 回答