我正在阅读正则表达式章节char set和backslash constructs。
在未经训练的眼睛看来,两个函数在匹配一组字符方面非常相似。
例如,正如我所想,[[:word:]]
和\sw
都匹配所有单词构成字符。
我可以知道是否有任何一个人更喜欢的情况 另一个?只是为了更好地理解。
或者,也许另一种问这个问题的方式是:有什么区别
在字符类(例如[:word:]
)和语法类之间(例如w
)?
字符类与类别 Here相同吗?
如果是,那么我认为问题1的答案可能是显而易见的,因为手册说类别和语法类之间的一个主要区别是前者不需要相互排斥。(一个字符可以属于许多字符类别。)
答案 0 :(得分:2)
关于语法类的一切都只是正则表达式代数的语法糖。
[[:class:]]
是POSIX正则表达式语法。您可以按 M-x man RET 7正则表达式RET 来研究详细信息。这些类仅指从集合中选择的1个字符。 Emacs与posix兼容,并实现了这种语法。这些类是从原子字符和代数中的OR
运算符获得的高级概念。示例:类digit
定义为0
或1
或......或9
,因此[:digit:]仅指该集合中的1个字符。
在正则表达式代数中,原子结构是字符,有3个运算符:OR,KLEENE STAR和CONCAT。所有其他的东西都是这些的组合 - 像+ = [class][class]*
这样的抽象或像WORD这样的新概念是通过它们的组合获得的。
但是,在编程时,需要使用基于这些类构建的高级模式,如WORD = [a-zA-Z0-9] +。这很常见,程序员为他们创建了一个特殊的名称。 WORD是原子结构的组合,即[[:alnum:]][[:alnum:]]*
。请注意,这涉及基本类alnum和concatenation
运算符和kleene star
运算符。因此,WORD是通过组合基本运算符和原子概念而获得的概念(alnum
不是原子的,因为它可以通过char
和or
运算符来定义,如上所述)。
要回答第二个问题,emacs中的类别是反向操作。如果WORD = [a-z ...],你有时想知道一个字符,它是否属于WORD,还是它所定义的其他类。