java - 在 Java 正则表达式中匹配 Unicode 破折号?

标签 java regex unicode character-properties

我正在尝试制作一个 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/

相关文章:

windows - 有没有办法在Windows键盘驱动程序中模拟箭头键?

java - 将自定义文本添加到 Google 可视化工具提示(使用 GWT API)

java - JBoss AS/Wildfly 中的多用户数据库连接池

php - 正则表达式:如何让\b 使用 utf-8 字符集?

java正则表达式: performance and alternative

regex - Perl 和 Regex - 从 .csv 解析值

java - 从java调用hsql函数

java - 如何停止在日志中截断堆栈跟踪

Javascript 正则表达式不敏感的土耳其字符问题

android - 同时支持多种语言?