Wil*_*ard 11 terminology posix regular-expression
替代标题:什么是符合 POSIX 的正则表达式中的“整理序列”或“整理元素”?
我在 POSIX 规范的第 9.3.5 节中找到了确切的技术定义,作为列表中的第 4 项,但我不太清楚。
我在网上搜索示例和解释,并没有完全空手而归,但绝对没有开悟。
我唯一得到的是,在某些情况下,您可以让您的正则表达式将多个字符视为单个字符,以便进行长度比较和确定“最长匹配”是什么(因为正则表达式是贪婪的并且返回最长的匹配)。
仅此而已吗?我很难看到它的用途,但我怀疑我的理解不完整。 正则表达式的“整理”实际上是什么? 以及如何[[.ch.]]
在POSIX规范的例子,涉及到这个?
排序规则元素通常在排序的上下文中引用。
在许多语言中,整理(如字典中的排序)不仅是按字符进行的。例如,在捷克,ch
不排序之间cg
,并ci
像它会英文的,但被认为是作为一个整体进行排序。它是一个排序元素(我们不能在这里引用字符,字符是排序元素的子集),它在h
和之间排序i
。
现在你可能会问,这和正则表达式有什么关系?,为什么我要在括号表达式中引用整理元素?.
好吧,在括号表达式中,确实使用顺序。例如 in [c-j]
,您需要和之间的字符。那你呢?你宁愿在那里整理元素。在捷克语语言环境中匹配:c
j
[h-i]
ch
$ echo cho | LC_ALL=cs_CZ.UTF-8 grep '^[h-i]o'
cho
Run Code Online (Sandbox Code Playgroud)
因此,如果您能够在括号表达式中列出一系列整理元素,那么您也希望能够单独列出它们。[a-cch]
将匹配a
和c
和c
和h
字符之间的整理元素。为了拥有a-c
和ch
整理元素,我们需要一个新的语法:
$ echo cho | LC_ALL=cs_CZ.UTF-8 grep '^[a-c[.ch.]]o'
cho
Run Code Online (Sandbox Code Playgroud)
(在之间的那些a
和c
与ch
之一)。
现在,世界还不完美,而且可能永远不会完美。上面的例子是在 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 处理起来就很棘手。
归档时间: |
|
查看次数: |
615 次 |
最近记录: |