2

助けてください、私の正規表現スキルは私を失敗させます。次の文字列があります。

username|email_address|phone_numbers[number]profile[title|addresses[id]]

角かっこの間のデータを抽出できるようにしたいのですが、そのデータが既に抽出されたセットのサブセットである場合はそうではありません。そのため、親の抽出された文字列の一部としてネストを残す必要があります。

上記の例では、次の 2 つの部分を抽出しました。

"number"
"title|addresses[id]"

[id] は下位レベルのデータセットの一部であるため、抽出されないことに注意してください。

私は preg_match でこれをやろうとしてきましたが、文字列内の各文字を反復処理する必要があるかもしれないと思います。

4

3 に答える 3

3

残念なことに、正規表現はメモリを持たないため、正規表現はブラケット マッチングを処理できません。( DFA相当)

あなたが望むものを達成するには、自分で小さなパーサーを書く必要があります(私は思う)、スタックを使用すると問題を解決できます;)

スタックを使用して問題を解決する基本的な考え方は、[スタックをプッシュするたびに、] を表示するたびに、スタックをポップして、前回見た [ から取得した文字列を後退させることです。 .

お役に立てれば ;)

于 2013-05-07T09:31:32.450 に答える
3

正規表現のソリューションは次のとおりです。

preg_match_all(
    '/(?<=\[)     # Assert that the previous characters is a [
      (?:         # Match either...
       [^[\]]*    # any number of characters except brackets
      |           # or
       \[         # an opening bracket
       (?R)       # containing a match of this very regex
       \]         # followed by a closing bracket
      )*          # Repeat as needed
      (?=\])      # Assert the next character is a ]/x', 
    $subject, $result, PREG_PATTERN_ORDER);
$result = $result[0];
于 2013-05-07T13:52:59.937 に答える