有检测"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