【问题标题】:What is the meaning of "equivalence class" in the context of regular expressions?在正则表达式的上下文中,“等价类”是什么意思?
【发布时间】:2021-06-01 12:55:53
【问题描述】:

在某些形式的正则表达式中,在方括号表达式中,= 符号是一个特殊字符,用作将任何一个等价类中的元素括起来的分隔符。 The documentation 说:

等价类表达式应表示属于等价类的整理元素集,如整理顺序中所述。仅应识别初级等价类。该类应通过将等价类中的任何一个整理元素括在括号相等(“[=”和“=]”)分隔符中来表示。例如,如果 'a'、'à' 和 'â' 属于同一个等价类,则 "[[=a=]b]"、"[[=à=]b]" 和 "[[ =â=]b]" 都等价于 "[aàâb]"。如果整理元素不属于等价类,则等价类表达式应视为整理符号。

我不太确定这意味着什么。如果aàâ 属于同一个等价类,这是否意味着我们希望指定正则表达式"[ab]""[àb]""[âb]" 是等价的?那么使用[==]分隔符的目的是什么,既然我们还不如写"[aàâb]"呢?

我理解“等价类”在其一般定义中的含义,但我无法理解它在这种情况下的含义。

【问题讨论】:

    标签: regex locale equivalence-classes


    【解决方案1】:

    例如,本质上,[=a=] 表示“属于a 所属的等价类的所有字符。如果aà 形成一个仅包含这两个的等价类,那么@987654326 @ 和[=à=] 都和 相同(显然写在[…] 内)。但是如果等价类还包含â,那么所有[=a=][=à=][=â=] 均表示aàâ(同样,写在[…])。

    等价类包含的字符取决于语言环境,但如果语言环境没有定义给定的等价类,比如说[=a=],那么将使用具有相同名称的排序序列,即[.a.],这通常与a 相同,因为语言环境通常包含普通字符作为整理序列。

    参考:Mastering Regular Expressions, 3rd Edition, page 128,这是一本关于正则表达式的优秀书籍,由了解正则表达式的人撰写。

    【讨论】:

    • 这些等价类是如何定义的?当我们在正则表达式中写[=a=]时,我们如何知道哪些字符属于a的等价类?
    • @ghulam_e_khuda,我已经更新了答案。
    • 你不知道,或者说你不想知道。你可能有类似"[=$c=]" 的东西,其中$c 是用户输入,你想匹配任何看起来像相同字符的东西。等价类是在 Unicode 数据集中定义的,您需要大量代码才能自己进行查找。
    • @LHMathies,这是对 OP 评论的回答吗?
    • @ghulam_e_khuda,有什么反馈吗?
    猜你喜欢
    • 1970-01-01
    • 2011-06-15
    • 2012-06-10
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多