Regex 正则表达式字符集(例如[:word:]])和反斜杠结构(例如.\sw):是否有一个优先于另一个?
我正在阅读regex章节和 在未受过训练的人看来,就匹配一组字符而言,这两种功能非常相似 例如,一个Regex 正则表达式字符集(例如[:word:]])和反斜杠结构(例如.\sw):是否有一个优先于另一个?,regex,emacs,Regex,Emacs,我正在阅读regex章节和 在未受过训练的人看来,就匹配一组字符而言,这两种功能非常相似 例如,一个[[:word:]和一个\sw都匹配所有的单词组成字符,正如我所想的那样 我可以知道是否有一种情况比另一种情况更可取吗 其他的?只是为了更好的理解 或者,也许另一种提问方式是:有什么区别 在字符类(例如[:word:)和语法类(例如w)之间 角色类和类别是一样的吗 如果是,那么我认为问题1的答案可能是显而易见的,因为手册说类别和语法类之间的一个主要区别是前者不需要相互排斥(一个字符可以属于多个类别
[[:word:]
和一个\sw
都匹配所有的单词组成字符,正如我所想的那样
[:word:
)和语法类(例如w
)之间关于语法类的一切都只是正则表达式代数的语法糖
[[:class:]
是POSIX正则表达式语法。您可以通过按M-x man RET 7 regex RET来研究细节。这些类只引用从集合中选择的1个字符。Emacs与posix兼容,并实现了这种语法。这些类是从原子字符和代数中的或运算符获得的高级概念。示例:类数字
定义为0
或1
或。。。或9
,因此[:digit:]仅表示该集合中的1个字符
在正则表达式代数中,原子结构是字符,有3个运算符:OR、KLEENE STAR和CONCAT。所有其他的东西都是这些东西的组合——像+=[class][class]*
这样的抽象或者像WORD这样的新概念都是通过这些东西的组合获得的
但是,在编程时,需要使用高级模式,这些模式是在这些类上构建的,比如WORD=[a-zA-Z0-9]+。这是如此普遍,以至于程序员为他们创建了一个特殊的名字。WORD是原子结构的组合,即[[:alnum:][[:alnum:][][:alnum:][]*
。请注意,这涉及基本类alnum和一个串联
运算符和克莱恩星
运算符。因此,单词是通过组合基本运算符和原子概念而获得的概念(alnum
不是原子的,因为它可以通过char
和或运算符来定义,如上所述)
要回答第二个问题,emacs中的类别是反向运算。如果WORD=[a-z…],您有时会想知道,给定一个字符,它是否属于WORD,或者它是在哪个类中定义的。谢谢您的详细回答。它涉及到许多对我来说是新的概念,我正试图进一步理解它们。你可以从阅读regexp的数学定义开始,了解其中的基本内容。