我正在尝试使用Pattern.split()创建一个Java正则表达式,将常规格式“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代码点,不是吗?
示例输入:
研究摘要(1/10) - 比赛
S(83)T(116)U(117)d(100)Y(121) (32)S(83)U(117)M(109)M(109)一(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)1(105)○(111)N(110)
在我看来,破折号是代码点8211,它应该与正则表达式相匹配,但事实并非如此!这是怎么回事?
答案 0 :(得分:12)
您将十进制(8211
)和十六进制(0x8211
)混合使用。
\x
和\u
都需要一个十六进制数字,因此您需要使用\u2014
来匹配em-dash,而不是\u8211
(和{{1}正常的连字符等。)。
但为什么不简单地使用Unicode属性“Dash punctuation”?
作为Java字符串:\x2D