为什么Unicode字符“MINUS SIGN”(U + 2212)不在正则表达式Unicode组\ p {Pd}(破折号标点符号)中?

3
我正在尝试收集所有破折号以便在分析原始文本数据时使用。我发现Unicode正则表达式\p{Pd}应该匹配所有情况,但最终发现这个字符并不匹配!关于这个字符的更多信息在这里:https://www.fileformat.info/info/unicode/char/2212/index.htm 这是一个错误还是一个特性?实际上,这并不是有用的东西。
1个回答

5
Unicode字符U+2212 MINUS SIGN是一个与数学相关的符号,可能不被视为标点符号。例如,它可以匹配\p{Math}但不能匹配\p{Punctuation}(其中包括\p{Dash_Punctuation})。
您可能想尝试使用\p{Dash},并检查它是否满足您的所有需求...
参考:Properties for U+2212 编辑:
以下是具有Dash Unicode属性的所有字符的“官方”列表:https://unicode.org/cldr/utility/list-unicodeset.jsp?a=[:Dash=Yes:],包括U+2212 MINUS SIGN字符。
在Unicode 12.0中,JavaScript正则表达式: /\p{Dash}/u 将等同于: /[\u002D\u058A\u05BE\u1400\u1806\u2010\u2011\u2012\u2013\u2014\u2015\u2053\u207B\u208B\u2212\u2E17\u2E1A\u2E3A\u2E3B\u2E40\u301C\u3030\u30A0\uFE31\uFE32\uFE58\uFE63\uFF0D]/

谢谢回复。问题是没有任何支持的正则表达式可以匹配“Dash”(请参阅https://www.regular-expressions.info/unicode.html)。因此,使用可用的正则表达式“\p{Pd}”来匹配这个字符并不能成功。 - Siarhei
可能是\p{Dash}属性在所有正则表达式引擎中都不可用。但在JavaScript中,在macOS终端上运行node,或在Chrome或Safari浏览器中:console.log(/\p{Dash}/u.test("−"));返回true - Jigorodake
编辑了答案,给出了Unicode 12.0中被视为破折号的28个Unicode字符的详尽列表。 - Jigorodake
太棒了!它还提供了普通的正则表达式方括号,因为在_google re2_中,例如/\p{Dash}/u是无效的。所以,对我来说,实际上仍然使用这个手工制作的表达式来处理所有类似连字符的字符是一个正确的解决方案: [-‐–—‑‒―−-᠆﹘﹣֊⸺⸻] 或者这个更短一些但有一点垃圾的表达式: [\p{Pd}|−] - Siarhei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接