有检测"isolated combining characters"的算法吗?
Is there an algorithm to detect "isolated combining characters"?
我对检测包含“未组合”或“悬挂”组合字符的字符串很感兴趣。这些正式名称为 .
这样的字符串的一个例子是 "\u0303 hello"
,它以 COMBINING TILDE
开头,实际上没有与其他任何东西组合。
有检测这种东西的算法吗?
看来我可以搜索字符串以查找“可组合”基本字符,并拒绝任何前面没有此类基本字符的组合字符。但是我怎么知道哪些字符是基本字符呢?我想还有一些边缘情况需要担心。
我的 objective 是在支持 Unicode 标识符的编程语言中拒绝将此类字符串作为无效标识符。但这也可能对其他文本处理任务有用。
Unicode 14.0 definitions D50, D51, D52 似乎相关。
您可以通过搜索
- 立即跟在非字母 (
L
)、数字 (N
)、标点符号 (P
)、符号 (S
) 或 Space 分隔符 (Zs
) 或另一个组合字符 (M
).
在 Java 中 - 语法为:
(?<!\p{L}|\p{N}|\p{P}|\p{S}|\p{Zs}|\p{M})\p{M}
完整的可运行示例(Scala,此处an online interpreter]:
val rgx = """(?<!\p{L}|\p{N}|\p{P}|\p{S}|\p{Zs}|\p{M})\p{M}""".r
val examples = List(
"\u0303bad",
"ok\u0303",
"ok\u0303\u0303",
"bad\u001F\u0303"
)
for (e <- examples) {
println(rgx.findFirstIn(e).nonEmpty)
}
打印:
true
false
false
true
我对检测包含“未组合”或“悬挂”组合字符的字符串很感兴趣。这些正式名称为
这样的字符串的一个例子是 "\u0303 hello"
,它以 COMBINING TILDE
开头,实际上没有与其他任何东西组合。
有检测这种东西的算法吗?
看来我可以搜索字符串以查找“可组合”基本字符,并拒绝任何前面没有此类基本字符的组合字符。但是我怎么知道哪些字符是基本字符呢?我想还有一些边缘情况需要担心。
我的 objective 是在支持 Unicode 标识符的编程语言中拒绝将此类字符串作为无效标识符。但这也可能对其他文本处理任务有用。
Unicode 14.0 definitions D50, D51, D52 似乎相关。
您可以通过搜索
- 立即跟在非字母 (
L
)、数字 (N
)、标点符号 (P
)、符号 (S
) 或 Space 分隔符 (Zs
) 或另一个组合字符 (M
).
在 Java 中 - 语法为:
(?<!\p{L}|\p{N}|\p{P}|\p{S}|\p{Zs}|\p{M})\p{M}
完整的可运行示例(Scala,此处an online interpreter]:
val rgx = """(?<!\p{L}|\p{N}|\p{P}|\p{S}|\p{Zs}|\p{M})\p{M}""".r
val examples = List(
"\u0303bad",
"ok\u0303",
"ok\u0303\u0303",
"bad\u001F\u0303"
)
for (e <- examples) {
println(rgx.findFirstIn(e).nonEmpty)
}
打印:
true
false
false
true