2012-03-07 32 views
5

書式設定のドキュメントを作成する必要があります。私はテキストをフォーマットするために使用される正規表現を知っているが、私はその正規表現の例を再現する方法を知らない。 この1つは内部リンクのようになります。正規表現にマッチする文字列を作成するにはどうすればよいですか?

'{\[((?:\#|/)[^ ]*) ([^]]*)\]}' 

誰もこれに合わせて、多分彼はそれを得た方法を説明します例を作成することができます。私は '?'で立ち往生した。

私はこのメタキャラクターを最初から使用していませんでしたが、通常、リテラルが表示されたり正確に1回しか表示されないことを示すために使用しています。

おかげ

答えて

3
(?:...)

(...)同じグルーピング効果を有するが、グループの内容を「捕捉」することなく、 http://php.net/manual/en/regexp.reference.subpatterns.phpを参照してください。

したがって、(?:\#|/)は、「#または/のいずれか」を意味します。

[^ ]*は「0以上のSPはない」を意味し、[^]]*は「ゼロ角以上の角カッコではない」ということを意味していると思います。それを一緒に置く

は、一つの可能​​な文字列はこれです:

'{[/abcd asdfasefasdc]}' 
+0

それは...多くの説明やドキュメント –

+0

@alexためのおかげで動作します:どういたしまして! – ruakh

3

は、いくつかの有用なツールのためのOpen source RegexBuddy alternativesOnline regex testingを参照してください。正規表現を最初に説明するのが最も簡単です。私はここYAPEを使用:

NODE      EXPLANATION 
---------------------------------------------------------------------- 
    \[      '[' 
---------------------------------------------------------------------- 
    (      group and capture to \1: 
---------------------------------------------------------------------- 
    (?:      group, but do not capture: 
---------------------------------------------------------------------- 
     \#      '#' 
---------------------------------------------------------------------- 
    |      OR 
---------------------------------------------------------------------- 
    /      '/' 
---------------------------------------------------------------------- 
    )      end of grouping 
---------------------------------------------------------------------- 
    [^ ]*     any character except: ' ' (0 or more 
          times (matching the most amount 
          possible)) 
---------------------------------------------------------------------- 
)      end of \1 
---------------------------------------------------------------------- 
          ' ' 
---------------------------------------------------------------------- 
    (      group and capture to \2: 
---------------------------------------------------------------------- 
    [^]]*     any character except: ']' (0 or more 
          times (matching the most amount 
          possible)) 
---------------------------------------------------------------------- 
)      end of \2 
---------------------------------------------------------------------- 
    \]      ']' 
---------------------------------------------------------------------- 

これはあなたの例では{}regex delimitersあるという仮定の下にあります。

あなただけの説明のリストを読み、などの可能なソース文字列を思い付くことができます。私は、これは設計上の正規表現を助けるために良い記事だと思います

[#NOSPACE NOBRACKET] 
1

。そのかなり簡単に書くことが容易な一方
一般的な正規表現を文字列に一致させることがありますが、逆にそれを見るには便利な場合があります
の設計後。場合によっては、どのようなビザのものがマッチするかを知る必要があります。

多くのメタ文字をリテラルとして混在させる場合、読みやすさとエラーを避けるために、
のような書式を設定することが非常に重要です。

ここでは、プロトタイプの方が簡単だったPerlサンプルがあります。

my @samps = (
'{[/abcd asdfasefasdc]}', 
'{[# ]}', 
'{[# /# \/]}', 
'{[/# {[ 
    | /# {[#\/} ]}', 
, 
); 

for (@samps) { 
    if (m~{\[([#/][^ ]*) ([^]]*)\]}~) 
    { 
     print "Found: '$&'\ngrp1 = '$1'\ngrp2 = '$2'\n===========\n\n"; 
    } 
} 

__END__ 

Expanded 

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

出力

Found: '{[/abcd asdfasefasdc]}' 
grp1 = '/abcd' 
grp2 = 'asdfasefasdc' 
=========== 

Found: '{[# ]}' 
grp1 = '#' 
grp2 = '' 
=========== 

Found: '{[# /# \/]}' 
grp1 = '#' 
grp2 = '/# \/' 
=========== 

Found: '{[/# {[ 
     | /# {[#\/}  ]}' 
grp1 = '/#  {[ 
     |' 
grp2 = '/# {[#\/}  ' 
=========== 
関連する問題