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

ner*_*dis 2 regex emacs perl pcre

RegExps是否有一种语法允许重复先前在同一RexExp中出现的组定义.请注意:我想再次'复制'组定义,我对前一组匹配的反向引用不感兴趣(即"\n"不是我要找的).

例如:我寻找的RegExp将匹配"spamniceggs","eggswithspam","spamlovelyspam","eggeggspam",但既不是"spamwithham"也不是"deliciousegg".

一个可能的PCRE RegExp将是:((?:spam)|(?:egg))\ w*((?: egg)|(?:spam))在这种情况下和类似情况下,避免显式重复会很好相同的组描述(DRY).因此,我正在寻找具有语义的假设运算符"~n",如下所示:应用重新应用与第n个捕获组相同的组描述.因此,示例RegExp可以表示为:(?:( ?: spam)|(?: egg))\ w*~1

有没有办法在这方面取得成果?

tri*_*eee 5

没有像这样的设施 您正在询问的正则表达式实现中的任何一个 Emacs,但周围的语言使它变得容易.在Lisp中:

(let* (s "spam")
      (e "egg")
      (sore (concat "\\(" s "\\|" e "\\)"))
      (regex (concat sore "[A-Za-z]*" sore)) )
  (... do stuff with regex ...)
Run Code Online (Sandbox Code Playgroud)

在C中,您可以类似地使用例如字符串构建正则表达式sprintf.

编辑:?(DEFINE)在PCRE中被忽略了.我将其留给Emacs /一般案例.