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


11

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

在POSIX规范的9.3.5节中找到了确切的技术定义,将其作为列表中的第4个项目,但是对我来说还不是很清楚。

我用Google搜索周围的网站为例子和解释上,并提出了不完全两手空空,但绝对不开明

我唯一要了解的是,在某些情况下,为了使长度比较和确定“最长匹配”是什么,您可以让正则表达式将多个字符当作单个字符对待(因为正则表达式贪婪且返回最长的匹配项)。

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

Answers:


7

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

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

现在您可能会问,与正则表达式有什么关系?为什么要在方括号表达式中引用整理元素?

好吧,在方括号内,确实使用了顺序。例如,在中[c-j],您希望字符介于c和之间j。那你呢?您宁愿在此整理元素。[h-i]在捷克的比赛中ch

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

因此,如果您能够在方括号表达式中列出一系列排序规则元素,那么您也希望能够单独列出它们。[a-cch]会匹配介于ac和之间的cand h字符。要具有a-cch整理元素,我们需要一种新的语法:

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

(介于a和之间cch一个)。

现在,世界还不是很完美,也许永远不会如此。上面的示例在GNU系统上并且可以正常工作。一个的另一示例排序元素可以是e与UTF-8组合重音符($'e\u0301'呈现像$'\u00e9'é)。

é和é是相同的字符,除了一个用一个字符表示而另一个用两个字符表示。

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

可以在某些系统上正常工作,但不能在其他系统上工作(例如,不是GNU的)。而且,目前还不清楚是否$'[[.\ue9.]]'应该只匹配$'\ue9'或两者$'\ue9'$'e\u301'

更不用说非字母脚本,或具有不同区域排序顺序的脚本,例如ffi(ffi一个字符)之类的东西,用这种简单的API很难处理。


1

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

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

[[.ch.]]表示有向图是一组字符的一部分。在这种情况下,实际上只有一个字符。只是标准的正则表达式符号。


斯蒂芬妮的答案看来ch 实际上是两个不同的角色。它只是出于排序目的而被视为一个。您确定“图”是适用的术语吗?
2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.