2012-04-18 11 views
3

Regexp(TuxRadar)についてオンラインのリソースをPHPで読むことを言っていないと言います。 著者によれば、以下はパターンに "aaa1"をマッチせず、したがってfalse(0)を返しますが、真(1)になります。Regexpがtrueを返すが、書籍の作者はそれが

​​

なぜですか?

Regular Expressions

+0

文字列の最後にはアルファベットがありません。 pre_matchをvarに割り当ててからvar_dumpしてみてください。 – HappyTimeGopher

+1

@HappyTimeGopher - 間違っています。試してごらん! –

+0

@Edあなたは正しいと思いますが、今はなぜでしょうか:) – HappyTimeGopher

答えて

7

あなたは必ずそこに後続の$があると想定されていないされていますか?最初の[a-z]ブロックが最初の2つのa文字に一致し、[0-9]が何も一致せず、最後の[a-z]が3番目のaに一致した場合、trueを返すことはかなり意味があります。末尾の1は無視されます。

は小文字

正規表現に固定されている場合、これが唯一の真実であると終わらなければなりません:そこに誤りがありますように見えるん

ブックへのリンクを見てみると、文字列の終わりは$です。

+0

なぜ1は無視されますか?それはオプションです、私はそれを得る。しかし、彼はそれを供給している。表現に一致するように "aaa1a"で終わるべきではありませんか? – Bob

+2

さて、REエンジンが動作する方法は、3つの 'a'文字すべてにマッチして試してみますが、実際には一致しません。その時点でエンジンはバックトラックし、 'a'マッチの1つを取り除き、その時点からやり直します。そのときだけ、 '[0-9]'はオプションなので、マッチは成功します。 – zigdon

+0

私はとても混乱しています。ありがとう – Bob

3

[0-9]?は数字ゼロまたは1回と一致するため、一致します。

<?php 
$str = "aaa1"; 
print preg_match("/[a-z]+[0-9]+[a-z]{1}/", $str); 
?> 

は一致しません。

+0

私は同意しますが、彼は1を提供します。 – Bob

+1

はい、しかし、[[0-9]? 'は0または1回の数字と一致します。 '' [az] + [0-9]?[az] {1} 'は、1つ以上の(小文字の)文字に続いてオプションの数字の後にもう1つの文字が続くので、文字列' 'aaa1 ''は数字はオプションです。また、 '{a-z} + [0-9]?[a-z] {1}'は '[a-z] + [0-9]?[a-z]'と同じです。 –

+0

だから、作者は間違いをしましたか? – Bob

2

正規表現

  1. [-Z]を打破することができます+、AA又はAAA
  2. [0-9]を一致しgreadyされ、一つ以上の文字を意味しますか?なるので、[AZ]数字
  3. に一致する可能性がすることは、[0-9] 1は、AAと一致するであろう任意であることによって

かもしれない文字と一致することを意味し、2 - 任意の手段一致するものはありません。3はaと一致します。

+0

そして、[[0-9]? 'の部分があるのは何ですか?正規表現はそれを無視しますか? – Bob

+2

@Bob「?」は「前の0または1と一致する」を意味します。これは、前の数字の "0"が一致したため、文字列に数字がない場合は '[0-9]? 'がtrueを返すことを意味します。 '[0-9]? 'の意味は、2つ以上の数字があった場合、正規表現によっては失敗する可能性があります。 –

関連する問題