私は正規表現を持っています:
'/ abc \( (complexRegex)(,complexRegex)*? \) /Uux'
次のようなものに一致させるには: abc(complexStructure,complexStructure,complexStructure)
complexRegexを2回書かないようにするには?
基本的なPHPでは、方法はありません(Eisbergが示唆するように変数トリックを使用することを除いて、正規表現自体で繰り返されます)。PHP5 では、鬼車 (Ruby 1.9 の拡張正規表現エンジン) が組み込まれていると聞きましたが、自分で試したことがなく、鬼車のウィキペディアのページに書かれている以外に適切なリファレンスが見つかりません。それが本当なら、あなたはこれを持つことができます:
/abc:(?<complexRegex>d.f)(,\g<complexRegex>)*:ghi/
"abc:def,daf,dif:ghi"
たとえば、パターンd.f
に名前を割り当てることにより ( )、パターンを繰り返さずに ( )一致しcomplexRegex
ます。
PHP を使用している場合は、complexRegex を変数で記述することを避けることができます。
$complexRegex = 'your complexRegex here';
$regex = '/ abc \( (' . $complexRegex . ')(,' . $complexRegex . ')*? \) /Uux';
PCRE の後方参照についてもお読みください: http://www.php.net/manual/en/regexp.reference.back-references.php
0 または 1 つのカンマを ? と一致させることができます。
'/ abc \((,?(complexRegex))* \)/
わかりやすくするために空白を追加しましたが、必要に応じて任意の数の空白を一致させる必要があります。
後方参照を使用することもできます。
(x[ms]l).com/\1
# the \1 is the backreference which matches the first capture group
一致します
xml.com/xml
and
xsl.com/xsl