2011-09-11 5 views
2

同じRexExpに登場していたグループ定義を繰り返すことができるRegExpsの構文はありますか?ご注意:グループ定義をもう一度 'コピー'したい、私は以前のグループのマッチの逆参照に興味がありません(つまり、「\ n」は私が探しているものではありません)。RegExp(PCREまたはEmacs):以前に定義されたグループの反復

たとえば、「spamniceggs」、「eggswithspam」、「spamlovelyspam」、「eggeggspam」に一致するRegExpを検索しますが、「spamwithham」と「deliciousegg」のどちらも検索しません。

可能性のあるPCRE RegExpは次のようになります。((?: spam)|(?:egg))\ w *((?: egg)|(?:spam)) この場合、同じグループ記述(DRY)を明示的に繰り返さないようにしてください。だから私は次のような意味を持つ仮説演算子 "〜n"を探しています:適用は、n番目のキャプチャグループと同じグループ記述を再適用します。したがって、例RegExpは次のように表すことができます:(?:(?: spam)|(?:egg))\ w *〜1

この行に沿って何かを達成する方法はありますか?

+0

Perlではqr //のような意味ですか? –

答えて

5

あなたがEmacsのについてを求めているが、周辺言語が十分にそれが容易になります正規表現の実装のどちらかで、このような何かのための機能はありません。 Lispの場合:

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

Cでは、同様に正規表現を文字列で、例えば、 sprintf

:PCREで?(DEFINE)を見落としていました。私はEmacs /一般的なケースのためにこれを残しています。

4

もしqr //のようなものがPerlであれば、PCREには?(DEFINE)と(?&)が使われています。それらはPerl 5.10からPCREにコピーされた機能です。 IPアドレスの例:

(?(DEFINE) (?<byte> 2[0-4]\d | 25[0-5] | 1\d\d | [1-9]?\d)) 
     \b (?&byte) (\.(?&byte)){3} \b 
関連する問題