RegExp(PCRE或Emacs):重复先前定义的组
regexp是否有语法,允许重复在同一个RexExp中出现的组定义。请注意:我想再次“复制”组定义,我对反向引用以前组的匹配项不感兴趣(即“\n”不是我要查找的内容) 例如:我寻找一个与“spamniceggs”、“eggswithspam”、“spamlovelyspam”、“egggeggspam”匹配的RegExp,但既不是“spamwitham”也不是“deliciousegg” 可能的PCRE RegExp是:((?:spam)|(?:egg))\w*((?:egg)|(?:spam)) 在这种情况下和类似情况下,最好避免明确重复相同的组描述(DRY)。因此,我正在寻找一个假设的运算符“~n”,其语义如下:应用-重新应用与第n个捕获组相同的组描述。因此,示例RegExp可以表示为:(?:(?:spam)|(?:egg))\w*~1RegExp(PCRE或Emacs):重复先前定义的组,regex,perl,emacs,pcre,Regex,Perl,Emacs,Pcre,regexp是否有语法,允许重复在同一个RexExp中出现的组定义。请注意:我想再次“复制”组定义,我对反向引用以前组的匹配项不感兴趣(即“\n”不是我要查找的内容) 例如:我寻找一个与“spamniceggs”、“eggswithspam”、“spamlovelyspam”、“egggeggspam”匹配的RegExp,但既不是“spamwitham”也不是“deliciousegg” 可能的PCRE RegExp是:((?:spam)|(?:egg))\w*((?:egg)|(?:spam)
有什么方法可以实现这一点吗?在您询问的关于Emacs的任何一个regex实现中都没有类似的工具,但是周围的语言使它变得足够简单。在Lisp中:
(let* (s "spam")
(e "egg")
(sore (concat "\\(" s "\\|" e "\\)"))
(regex (concat sore "[A-Za-z]*" sore)) )
(... do stuff with regex ...)
在C语言中,您可以类似地用字符串构建正则表达式,例如sprintf
编辑:忽略了PCRE中的
?(定义)
。我把它留给Emacs/一般情况。如果您是指Perl中类似qr//的内容,PCRE没有它,请使用?(DEFINE)和(?&)。它们是从Perl5.10复制到PCRE的特性。IP地址示例:
(?(DEFINE) (?<byte> 2[0-4]\d | 25[0-5] | 1\d\d | [1-9]?\d) )
\b (?&byte) (\.(?&byte)){3} \b
(?(定义)(?2[0-4]\d | 25[0-5]| 1\d\d |[1-9]?\d))
\b(?&byte)(\.(?&byte)){3}\b
您的意思是Perl中的qr//吗?