[[.ch.]] 在正则表达式中意味着什么?

[[.ch.]] 在正则表达式中意味着什么?

备用标题: POSIX 兼容正则表达式中的“整理序列”或“整理元素”是什么?

我在中找到了确切的技术定义POSIX 规范第 9.3.5 节,作为列表中的第 4 项,但我不太清楚。

我在网上搜索示例和解释,但没有找到完全地空手而归,但绝对不是开明

我唯一得到的是,在某些情况下,您可以让正则表达式将多个字符视为单个字符,以进行长度比较并确定“最长匹配”是什么(因为正则表达式是贪婪的并且返回最长的可能匹配)。

但这就是全部了吗?我很难看到它的用途,但我怀疑我的理解不完整。 正则表达式的“整理”实际上是什么?[[.ch.]]POSIX 规范中的示例与此 有何关系?

答案1

排序规则元素通常在排序上下文中引用。

在许多语言中,排序规则(像字典一样排序)不仅仅针对每个字符进行。例如,在捷克语中,ch不会像英语中那样在 和 之间进行排序cgci而是将其视为一个整体进行排序。它是一个排序元素(这里不能引用字符,字符是排序元素的子集),在h和之间排序i

现在你可能会问,这和正则表达式有什么关系?,为什么我想在括号表达式中引用整理元素?

嗯,在括号表达式中,确实使用了顺序。例如在 中[c-j],您想要人物c和之间j。那你呢?您宁愿在那里整理元素。[h-i]在捷克语言环境中匹配ch

$ echo cho | LC_ALL=cs_CZ.UTF-8 grep '^[h-i]o'
cho

因此,如果您能够在括号表达式中列出一系列整理元素,那么您也希望能够单独列出它们。将匹配and和and字符[a-cch]之间的整理元素。为了拥有整理元素,我们需要一个新的语法:accha-cch

$ echo cho | LC_ALL=cs_CZ.UTF-8 grep '^[a-c[.ch.]]o'
cho

ac之间的那些ch)。

现在,世界还不完美,而且可能永远不会完美。上面的例子是在 GNU 系统上运行的。另一个例子是整理元素可以e与 UTF-8 中的锐音重音组合在一起($'e\u0301'呈现为$'\u00e9'as é)。

é 和 é 相同特点只不过一个用一个字符表示,另一个用两个字符表示。

$ echo $'e\u301t\ue9' | grep '^[d-f]t'

在某些系统上可以正常工作,但在其他系统上则不能(例如 GNU 系统)。并且尚不清楚是否$'[[.\ue9.]]'应该仅匹配and$'\ue9'或两者都匹配。$'\ue9'$'e\u301'

更不用说非字母脚本,或者具有不同区域、排序顺序的脚本,比如 ffi(ffi一个字符),使用如此简单的 API 来处理这些脚本会变得很棘手。

答案2

当使用非英语(非 ASCII)字符时,这很有用。你提到的例子ch是一个有向图,即某些语言的字母表中的一个字母可以由英语字母表中的两个字母表示。

当您[.ch.]在正则表达式中使用时,您基本上会说:“我期望带有二合字母的非英语输入序列ch。我希望我的正则表达式与单个字符匹配ch。我的编程语言/正则表达式引擎/键盘不允许我编写此二合字母符号,所以我输入的[.ch.]不是c后跟 的h。请仅查找作为单个字符出现的二合字母。”

[[.ch.]]表示二合字母是字符集的一部分。在这种情况下实际上只有一个字符。只是标准的正则表达式表示法。

相关内容