0

私は正規表現を持っています:

'/ abc \( (complexRegex)(,complexRegex)*? \) /Uux'

次のようなものに一致させるには: abc(complexStructure,complexStructure,complexStructure)

complexRegexを2回書かないようにするには?

4

4 に答える 4

2

基本的なPHPでは、方法はありません(Eisbergが示唆するように変数トリックを使用することを除いて、正規表現自体で繰り返されます)。PHP5 では、鬼車 (Ruby 1.9 の拡張正規表現エンジン) が組み込まれていると聞きましたが、自分で試したことがなく、鬼車のウィキペディアのページに書かれている以外に適切なリファレンスが見つかりません。それが本当なら、あなたはこれを持つことができます:

/abc:(?<complexRegex>d.f)(,\g<complexRegex>)*:ghi/

"abc:def,daf,dif:ghi"たとえば、パターンd.fに名前を割り当てることにより ( )、パターンを繰り返さずに ( )一致しcomplexRegexます。

于 2012-11-23T14:21:19.093 に答える
1

PHP を使用している場合は、complexRegex を変数で記述することを避けることができます。

$complexRegex = 'your complexRegex here';

$regex = '/ abc \( (' . $complexRegex . ')(,' . $complexRegex . ')*? \) /Uux';

PCRE の後方参照についてもお読みください: http://www.php.net/manual/en/regexp.reference.back-references.php

于 2012-11-23T14:11:40.217 に答える
0

0 または 1 つのカンマを ? と一致させることができます。

'/ abc \((,?(complexRegex))* \)/

わかりやすくするために空白を追加しましたが、必要に応じて任意の数の空白を一致させる必要があります。

于 2012-11-23T14:07:46.780 に答える
-1

後方参照を使用することもできます。

(x[ms]l).com/\1    

# the \1 is the backreference which matches the first capture group

一致します

xml.com/xml
 and 
xsl.com/xsl
于 2012-11-23T14:16:46.390 に答える