[[.ch.]] 在正则表达式中是什么意思?

Wil*_*ard 11 terminology posix regular-expression

替代标题:什么是符合 POSIX 的正则表达式中的“整理序列”或“整理元素”?

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

我在网上搜索示例和解释,并没有完全空手而归,但绝对没有开悟

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

仅此而已吗?我很难看到它的用途,但我怀疑我的理解不完整。 正则表达式的“整理”实际上是什么? 以及如何[[.ch.]]在POSIX规范的例子,涉及到这个?

Sté*_*las 7

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

在许多语言中,整理(如字典中的排序)不仅是按字符进行的。例如,在捷克,ch不排序之间cg,并ci像它会英文的,但被认为是作为一个整体进行排序。它是一个排序元素(我们不能在这里引用字符,字符是排序元素的子集),它在h和之间排序i

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

好吧,在括号表达式中,确实使用顺序。例如 in [c-j],您需要和之间的字符。那你呢?你宁愿在那里整理元素。在捷克语语言环境中匹配:cj[h-i]ch

$ echo cho | LC_ALL=cs_CZ.UTF-8 grep '^[h-i]o'
cho
Run Code Online (Sandbox Code Playgroud)

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

$ echo cho | LC_ALL=cs_CZ.UTF-8 grep '^[a-c[.ch.]]o'
cho
Run Code Online (Sandbox Code Playgroud)

(在之间的那些acch之一)。

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

é和e?是相同的字符,只是一个用一个字符表示,另一个用两个字符表示。

$ echo $'e\u301t\ue9' | grep '^[d-f]t'
Run Code Online (Sandbox Code Playgroud)

将在某些系统上正常工作,但不能在其他系统上正常工作(例如,不是 GNU 系统)。并且不清楚是$'[[.\ue9.]]'应该只匹配$'\ue9'还是同时匹配$'\ue9'$'e\u301'

更不用说非字母脚本,或具有不同区域、排序顺序的脚本,诸如 ffi(ffi一个字符)之类的东西,用这样一个简单的 API 处理起来就很棘手。