• ベストアンサー

正規表現 先頭一桁をマッチさせるには

$a = (1001,xxxx,yyyy) とします。 先頭一桁の値を使いたいのですが、 $a = explode(',',$buffer); preg_match("/(.)*/",$a[0],$match)とすると、 $a[1]の値は下一桁になります。 先頭一桁にするには、どうすれば良いのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • okmotokun
  • ベストアンサー率59% (92/155)
回答No.2

/(.)?/ ---- 最短マッチ /(.)*/ ---- 最長マッチ ですから、先頭一桁を検索するなら、 No.1さんの回答のように /^(.)/ か /(.)?/、 /(.).*/、 /(.)/ としないといけないでしょう。

peiee
質問者

補足

先頭一桁の検索は、/^(.)/ か /(.)?/、/(.).*/、/(.)/ですか。 ありがとうございます。 (.)*と(.)?と(.).*と(.).*? は、どのような意味なのでしょうか? ちょっと違いますが、下記を実行すると <?php $var="Japan America France England"; if(preg_match("/\b([AIUEOaiueo]*)\b/",$var,$result)){ print_r($result); print("<br>"); }else{ print(一致しませんでした。); } if(preg_match("/\b([AIUEOaiueo]?)\b/",$var,$result)){ print_r($result); print("<br>"); }else{ print(一致しませんでした。); } if(preg_match("/\b([AIUEOaiueo].*)\b/",$var,$result)){ print_r($result); print("<br>"); }else{ print(一致しませんでした。); } if(preg_match("/\b([AIUEOaiueo].*?)\b/",$var,$result)){ print_r($result); print("<br>"); }else{ print(一致しませんでした。); } ?> 結果は、 Array ( [0] => [1] => ) Array ( [0] => [1] => ) Array ( [0] => America France England [1] => America France England ) Array ( [0] => America [1] => America ) となりました。 (.)*は最長マッチ、(.)?は最短マッチだそうですが、何もセットされません。 ちょっとお手上げ状態になりました。 正規表現を覚えるのは、パターンでも覚えるのでしょうか? それとも、こういうのも理解しないといけないでしょうか?

その他の回答 (4)

回答No.5

if(preg_match("/\b([AIUEOaiueo]*)\b/",$var,$result)) if(preg_match("/\b([AIUEOaiueo]?)\b/",$var,$result)) こちらの件、 if(preg_match("/\b\b/",$var,$result)) でもマッチします。 境界を表すものを連続して表記してもマッチするようです。(境界を一文字とカウントしないから?) ソレを踏まえた上で、「*」「?」ですが 「*」は0文字以上にマッチするわけなので、空になるのは分かると思います。 「?」に関してですが、「*?」「+?」とあるときは最短マッチですが それ以外で「?」と記述した場合は、「直前の文字を0又は1回にマッチ」となります。 その為、後方参照される値には含まれないものと思います。

peiee
質問者

お礼

$var="Japan America France England"; if(preg_match("/\b([AIUEOaiueo]*)\b/",$var,$result))の結果が、 Array ( [0] => [1] => ) となるのは、()の中に量指定子が入っているわけで、 ([AIUEOaiueo]*)で検索。 [AIUEOaiueo]が0回以上、つまり「空」を検索して、空がマッチ。$result[0]は「空」 ([AIUEOaiueo]*)とグループ化しているので、$result[1]は「空」 if(preg_match("/\b([AIUEOaiueo].*)\b/",$var,$result)){ の結果は、 Array ( [0] => America France England [1] => America France England ) これは、[AIUEOaiueo]の任意の1文字で検索して、最長マッチ ([AIUEOaiueo].*)とグループ化しているので、$result[1]は、America France England if(preg_match("/\b\b/",$var,$result))の結果は、 Array ( [0] => ) 空で検索して、[0]は空 グループ化していないので、ここで検索終了。 /(.)?/は最短マッチ /(.)*/は最長マッチという意味で、 「*?」「+?」も最短マッチ $var = "abcd"; preg_match("/(.)*/", $var, $match); $match[1]にdが入る 最後に検索された値が残る(上書きされる) (.)を検索しているのではないでしょうか(..) ありがとうございました。

  • okmotokun
  • ベストアンサー率59% (92/155)
回答No.4

No.2です。 if(preg_match("/\b([AIUEOaiueo]*)\b/",$var,$result)) if(preg_match("/\b([AIUEOaiueo]?)\b/",$var,$result)) 上記は等価で、いずれの「単語」にもマッチします。 結果 Array ( [0] => [1] => ) といことは 「空」が入っているということです。 したがって、量指定子の単なる「*」「?」はこの場合意味が無いです。 場合によって、*?、(..)?、(..)*?、とすると違う意味になります。

peiee
質問者

お礼

回答ありがとうございます。<m(__)m> 指定の誤りということで、結果が「空」なのでしょうか

peiee
質問者

補足

いずれの「単語」にもマッチするのに、なぜ結果が「空」なのでしょうか? 意味が無いから、結果が空になったのでしょうか?

回答No.3

あまり自身はないですが・・・・ $var = "abcd"; preg_match("/(.)*/", $var, $match); これの結果が、$match[1]にdが入るという件、 「.」は任意の一文字をさし、任意の一文字だけをグルーピングしている グルーピングの外側で「*」を指定しているので 「a」が検索され、「b」が検索され、「c」が検索されて、「d」が検索される。 ただしグルーピングされる内容は一文字だけになるため、最後に検索された値が残る(上書きされる) というものなのだと、「思われます」。 結果から見る予測なので、実際はどうなっているのかは分かりません。

peiee
質問者

補足

回答ありがとうございます。おっしゃっていることはあっているような感じがします。#2の補足で、また質問しました。正規表現は難しいですね。(^_^;)

回答No.1

先頭の文字を取得するには、 preg_match('/^(.)/', $a[0], $match) とすれば良いと思います。 「^」が先頭であることを示します。 また、「$」を最後に入れると、そこが文末です。

peiee
質問者

お礼

すいません。 $a = (1aaa,xxxx,yyyy) $a = explode(',',$buffer); preg_match("/(.)*/",$a[0],$match)と、 "1aaa"で実行すると$a[1]は"a"でした。 "Japan America France England"の検索で /([AIUaiu].*?)([EOeo].*?)/の場合 preg_matchで値を取得した場合 [0]"America" [1]"Am" [2]"erica" と取得されています。この場合は左から検索しています。 なぜ下1桁を取得したのでしょうか?

peiee
質問者

補足

ありがとうございます。ところで、 preg_match("/(.)*/",$a[0],$match) は、なぜ下一桁を取得したのでしょうか、 「.」任意の一桁 「*」0回以上の繰り返し で$a[0]は"1001"となりますが、 次はその中の(.)を検索すると思うのですが、 数字とみなして、右から検索したのでしょうか?

関連するQ&A