1

これらのテキストのいずれかに一致する正規表現(PHP)を作成しようとしています。

#{text}
#{text1}{text2}
#{text1}{numbers}{text2}
#{text1}{text with spaces}{numbers}{text2}

など。基本的に、最初のブロックはスペースのないテキストしか保持できませんでしたが、残りのブロックは何でも保持できました。その後、それらのtext1 ... numbersなどに一致するように取得します。いくつかの正規表現を試してみましたが、うまくいきませんでした。これが最後のものです:

/#{(\w+)}({([\ a-zA-Z0-9*])})*/U

前もって感謝します!

編集: @stemaが提案したように、正規表現をこれに変更しました:

/#\{(\w+)\}(\{([^}]*)\})*/

Ungreedyフラグは表現にまったく役立たなかったので、避けました:)。ただし、結果は必要な数ではありません。

array(4) {
  [0]=>
  string(42) "#{text1}{text with spaces}{numbers}{text2}"
  [1]=>
  string(5) "text1"
  [2]=>
  string(7) "{text2}"
  [3]=>
  string(5) "text2"
}

中間のパラメーターは解析されていないようです(これは私には奇妙に見えます)。

4

2 に答える 2

5

私が見る主な問題は、数量詞が置き忘れられていることです

/#{(\w+)}({([\ a-zA-Z0-9*])})*/U
                        ^

キャラクタークラスの外にいる必要があります

/#{(\w+)}({([\ a-zA-Z0-9]*)})*/U

次の中括弧の内容があなたがこれを行うことができるよりも何かである可能性がある場合

/#\{(\w+)\}(\{([^}]*)\})*/U

[^}]は、閉じ中括弧以外のものに一致する否定文字クラスです。

中括弧は数量詞の一部として特別な意味を持っているので、私も中括弧をエスケープしました。一部の言語は、そのような数量詞を形成しない場合は文字通り一致しますが、明確にするために、一致する必要がある場合は常にそれらをエスケープする方がよいでしょう。

アップデート:

あなたはそれを必要としないように見えるので、あなたのグループの1つを非キャプチャグループにすることができます

/#\{(\w+)\}(?:\{([^}]*)\})*/

これはあなたにこの結果を与えるはずです

array(4) {
  [0]=>
  string(42) "#{text1}{text with spaces}{numbers}{text2}"
  [1]=>
  string(5) "text1"
  [2]=>
  string(5) "text2"
}

ただし、各一致はに格納されるため、結果の配列で繰り返されるグループの最後の一致のみが常に取得されarray[2]ます。2番目の一致は最初の一致を上書きし、3番目の一致は2番目の...を上書きします。

できることは、フォーマットの検証に正規表現を使用してから、次のような分割を行うことです。

$in = "#{text1}{text with spaces}{numbers}{text2}";
$result = preg_split('/}{|#{|}/', $in, -1, PREG_SPLIT_NO_EMPTY);
于 2012-04-30T11:10:10.470 に答える
2

ステマの答えに続いて私は提案します

  1. 正規表現で文字列を検証する
  2. この目的でキャプチャグループを使用することはできないため、この正規表現の先頭#{と末尾}、そして文字列を削除しますsplit}{

これにより、すべての一致の配列が得られるはずです。

于 2012-04-30T12:05:56.153 に答える