Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RegExp(PCRE或Emacs):重复先前定义的组_Regex_Perl_Emacs_Pcre - Fatal编程技术网

RegExp(PCRE或Emacs):重复先前定义的组

RegExp(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)

regexp是否有语法,允许重复在同一个RexExp中出现的组定义。请注意:我想再次“复制”组定义,我对反向引用以前组的匹配项不感兴趣(即“\n”不是我要查找的内容)

例如:我寻找一个与“spamniceggs”、“eggswithspam”、“spamlovelyspam”、“egggeggspam”匹配的RegExp,但既不是“spamwitham”也不是“deliciousegg”

可能的PCRE RegExp是:((?:spam)|(?:egg))\w*((?:egg)|(?:spam)) 在这种情况下和类似情况下,最好避免明确重复相同的组描述(DRY)。因此,我正在寻找一个假设的运算符“~n”,其语义如下:应用-重新应用与第n个捕获组相同的组描述。因此,示例RegExp可以表示为:(?:(?:spam)|(?:egg))\w*~1


有什么方法可以实现这一点吗?

在您询问的关于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//吗?