2011-01-10 9 views
4

特定の文字列の文字列をチェックする必要がありますが、これに正規表現を使用したいのですが、もっと努力し続けるほど、混乱してしまいます。私はそれを正しくするように見えることはできません。正規表現のパターンを正しく取得できないようです

私は文字列はこのようなものが含まれる場合式がtrueを返す必要がある

[[module:instance]]を、それは、以下の条件を満たしている必要があります

2つのブラケットの後には、必ずオープン2つのブラケット [[
    • 文字列は:を除くすべてを含むことができ、長さに制限はありません
    • 文字列の後1 :文字が存在する必要があります
    • 0の後は再び:以外のすべてが含まれており、2つのブラケット]]

    すべてのヘルプ、ヒント、良いチュートリアルと常に密接なそれの長さ

  • に制限はありませんができる文字列は、何をいただければ幸いです!

    ありがとうございます! *、彼らはメタキャラクタが好きだから

    \[\[.*?:[^:]*?\]\] 
    

    バックスラッシュは、角括弧の前に必要とされていると:。

  • +0

    だけコメント - 正規表現の実行の測定速度と正規表現なしで同じことをやろう。私は、正規表現のない単純な変形がより速くなるという気持ちを持っています。 –

    +0

    '[[a [[b:c]] d]]'で一致させるべきものは何ですか? – Gumbo

    答えて

    6

    これを試してみてください:

    preg_match('/\[\[[^:]+?:[^:]+?]]/', $str, $match) 
    

    説明:

    • \[\[は一致しが:(非欲張り)何でも
    • に一致する[[
    • [^:]+?リテラル:はリテラル:
    • [^:]+?:(非欲張り)何でも
    • ]]リテラル]]と一致すると一致して一致しました。
    +0

    魅力的な作品です! (なぜなら、私はそれをやっていることを知ってうれしいですね:)ありがとうございました:) –

    +0

    なぜ\\ [\\ [ ] to match]]最後に?ちょうどあなたの答えの正確さに疑問を呈していないことを学ぶことを試みています... –

    +1

    @残念:あなたは冒頭で開いた括弧をエスケープしました。そうでなければ、それらは文字クラスの開始として解釈されます。閉じた括弧は文字クラス外で特別な意味を持たず、エスケープする必要はありません。 –

    1

    あなたの正規表現のためにこれを試してみてください?。

    +0

    これも '[[::::module:]]'と一致しますか? –

    +0

    いいえ。最初の ':'に達すると中間の ':'が必要になり、最後のグループが*:* ':'とすべてマッチすると、最初の非貪欲なマッチは止まります。しかし、[[:]]は一致します(OPがそれを望んでいるかどうかはわかりません)。 – Jacob

    +0

    あなたは正しいです、@ヤコブ、私は非貪欲について忘れました! –

    0

    \[\[[^:]+\:[^:]+\]\]?それは動作しますか?

    これは、2つのリテラル文字[、その後、その後、その後、少なくとも一度繰り返さない:れる任意の文字、:、その後、少なくとも一度2つのリテラル文字]:ではない任意の文字と一致する必要があります。

    2
    \[\[[^:]+:[^:]+\]\] 
    

    説明:

    \[\[は、2つの開口ブラケットに一致します。

    [^:]は、いずれもと一致します。コロン以外はです。

    [^:]+と大文字と小文字を区別します。

    +0

    これは '[[[b:c]] d]] '。 – Gumbo

    +0

    @Gumboこれは大丈夫です:文字列1と文字列2はセミコロン以外のものを含むことができます。これにより二重括弧が可能です。 –

    +0

    @Gumboそれができます。しかし、質問者は決してそれはすべきではないと言った –

    0

    これは機能しますか?

    [[[^:] :{1} [^:]]]

    関連する問題