2010-12-31 5 views
3

私は\ Gのアンカーが文字列の先頭に一致しないようにしようとしています。私はそれが最後の正規表現マッチの最後に一致するようにしたいだけです。RegEx(PCRE)の前回の試合の最後に続行

Pig, Cow, Goat 
fruit: apple, orange, peach, pear 
vegetable: Carrot, Lettuce, Cellery 

このパターン:次のテキストを考える

、私はそれが個別に各単語をキャプチャする必要があります:「フルーツ」

(fruit:|\G)([\w]+|[\, ]) 

を私は後にのみマッチ言葉にそれをしたいです。私がちょうどこのパターンの最後に+を付けると、 "フルーツ"の後のすべての単語にマッチしますが、最後に+ストンプを繰り返すたびに "ナシ"が捕獲されます。

ここに問題があります。このパターンは、 "Pig、Cow、Goat"にもマッチしますが、\ Gは最後のマッチの終わりまたは文字列全体の始まりと一致するため、マッチします。どのように私はそれが全体の文字列の先頭に一致するのを防ぐことができますか?

私はPHPでPCREを使用しています。私はRubular.comを使用して、迅速なテストを手伝っています。

答えて

6

私の目には、正規表現はあなたが望むと言ったものをあなたに与えていないということです。あなたは、それぞれの言葉が "果物"に従ったかったと言った。あなたの例を考えれば、私はあなたの最初の試みが本当にあなたにそれを与えているとは思わない。試してみてください:

(?:fruit:\s*|\G,\s*)(\w+) 

あなたがすべてと一致する場合、空白または句読点なしであなたの単語を与える必要があること。ここで

は荒廃です:

  • (?: - 良い試合のためのプリアンブル
  • | - - または
  • \G,\s*) - 最後にマッチした位置、コンマ非キャプチャグループ
  • fruit:\s*を開始します0個以上の空白
  • (\w+) 1文字以上の単語をキャプチャします

はEDIT:最初の行は、1つまたは複数のカンマで区切られた単語に続くカンマで始まる場合

だけマイナスを追加し、あなたが最初の行に一致するものを取得するケースを防ぐためにゼロ幅ルックの背後にスタートアンカー上だけ\G前:これは私を助けている

(?:fruit:\s*|(?<!^)\G,\s*)(\w+) 
+0

あなたは '\ G'後に区切り文字を'、 '含まれたことです。興味深い考え。私の問題は、デリミタとスペースはオプションであるということです。それらがオプションであるので、このパターンは、私が制御できない文書 'Pig'の最初から容易にマッチングを開始することができます。私も 'preg_replace'を使っていると説明していませんでした。私は' fruit: 'という単語を別々にマッチさせたいので、置き換え文字列を使ってその場所に戻すことができます。したがって私は '?:'を私のパターンで使用しませんでした。 – Andrew

+0

果物の周りにカッコを入れてそれを捕まえるだけです。区切り文字とスペースはオプションで、どのように単語を区切りますか? – RobertB

+0

他にもう1つ...少なくとも私がそれを上のパターンに置く方法は、最初の行でなければ行頭をキャプチャしていないようで、最初の行はカンマで始まります。あなたが言及していないいくつかのオプションを使用していますか? "ドットは改行にマッチする"? "^ $改行で一致する"? – RobertB

関連する問題