2013-05-20 23 views
5

[]内の最後の7桁の数字だけを一致させる必要がある文字列があります。文字列は、この2番目の大括弧([])の間の正規表現マッチング

のように見えます[15211Z:2012年9月12日]([5202900])

私は、([])の間に含まれる文字列に似た番号を5202900と一致する必要がありますこのようなものが(\d{7})

を動作しませんので、文字列のどこにでも現れる可能性があり、私はまた、次の正規表現

([[0-9] {1,7}])

を試してみました

これには文字列に[]が含まれていますか?

+0

どのような正規表現のフレーバを使用していますか? – HamZa

+0

@HamZaDzCyber​​DeV - PHPと一緒にregexを使用する – Roland

+4

'(?<= \ [)\ d {7}(?= \])'、[demo](http://regex101.com/r/lC8kA5)を使用してください。 – HamZa

答えて

4

は:FYI

(?<=\[)\d{7}(?=\]) 

:これは肯定先読み肯定後読みと呼ばれています

トピックに関する良い情報源:http://www.regular-expressions.info/lookaround.html

+1

笑、あなたはすべてを裏返して、上記の私のコメントを見て... – HamZa

+0

@ハムザDzCyber​​DeV:それを指摘していただきありがとうございます!私は今それを訂正しました。それはあまりにも速く書くときの問題です;-) – ATN

+0

問題なし、** + 1 **:D – HamZa

0

あなたはこの全体の正規表現に一致するように、そしてあなたがグループ1、エスケープされていない括弧の間に1つを取る、\(\[(\d{7})\]\)をマッチングしてみ

\[(\d{1,7})\] 
1

を使用しようとすることができます。 {7}は、0以上の場合は「*」、1つ以上の場合は+、またはあなたの質問に既に示したような正確な範囲に置き換えることができます。あなただけの7桁の数字ではなく、かっこをしたいが、数字は括弧で囲まれていることを確認するには

+0

これは数値だけではなく、正規表現を不必要に複雑にしなくても簡単に数値を取得できるようにします(例えば、先読みや先読みなど)。グループはそれらよりもはるかに多く使われています。 –

0

最初のパターンは、あなたが([123])のような括弧で囲まれた数字のグループを抽出するために、これは動作するはずです、あなた(だけではなく数字)のように見える場合:

\(\[(\d+)\]\) 
0

あなたの詳細から、lookbehindとlookaroundは良いものと思われます。 7桁のパターンは、行の末尾に期待されているので、マッチを見つけるために少ない作業するエンジンの必要性を

(\d{7})\]\)$ 

:あなたはまた、このいずれかを使用することができます。

希望すると助かります!ここで

0

は(Perlで、私はPHPで同じ近いだと思う)ベンチマークで前後参照アプローチとキャプチャグループを比較している:

use Benchmark qw(:all); 

my $str = q/[15211Z: 2012-09-12] ([5202900])/; 
my $count = -3; 
cmpthese($count, { 
     'lookaround' => sub { 
      $str =~ /(?<=\[)\d{7}(?=\])/; 
     }, 
     'capture group' => sub { 
      $str =~ /\[(\d{7})\]/; 
     }, 
    }); 

結果:我々として

    Rate lookaround capture group 
lookaround 274914/s   --   -70% 
capture group 931043/s   239%   -- 

キャプチャが見た目より3倍以上速いことがわかります。