メタ文字(位置指定)とは?

このQ&Aのポイント
  • メタ文字(位置指定)とは、シンボルの境界以外の文字列を指すものです。
  • 例えば、正規表現パターン「A(b?)c\B」を使うと、連続した「Abc」や「xAbcyz」の「Abc」をマッチさせることができます。
  • しかし、文中の「uiAc+A」の「Ac」はマッチしません。
回答を見る
  • ベストアンサー

メタ文字(位置指定)\B

\Bはシンボルの境界以外で、文字列の先頭末尾空白以外らしいですが、 $var="Abcxx xAbcyz uiAc+A eeAc Ac xAc"; preg_match_all("/A(b?)c\B/",$var,$result) を実行しました。 結果 Array ( [0] => Array ( [0] => Abc [1] => Abc ) [1] => Array ( [0] => b [1] => b ) ) [0][0]Abc *****AbcxxのAbc [0][1]Abc *****xAbcyzのAbc [1][0]b ***AbcxxのAbcのb? [1][1]b ***xAbcyzのAbcのb? uiAc+AのAcもマッチしてないでしょうか?[0][2]Ac が表示されません。

  • peiee
  • お礼率60% (51/84)
  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
回答No.1

\B、\bは、「単語の境界」と記述されておりますが、 単語とは、「\w」で定義されているもののことを指すようです。 なおかつ、\wは、"[A-Za-z0-9_]" と指定した場合と同じ意味になりますので、「+」は単語ではないということになります。 そうすると、\Bは単語([A-Za-z0-9_])の境界以外とマッチしますので、「+」は単語の境界に当たってしまうので、マッチされないということではないでしょうか。

peiee
質問者

お礼

わかりました。ありがとうございました。<m(__)m>

関連するQ&A

  • メタ文字の$

    $はメタ文字で文字列(あるいは行)の末尾の位置を表すみたいですが、 $var="Abcxx xAbcyz uiAc+A eeAc Ac xAc"; preg_match("/A(b?)c$/,$var,$result) は 結果 Array ( [0] => Ac [1] => ) となりました。 末尾の前がAbcかAcの文字を検索していると思うのですが、 preg_matchなので、eeAcのAcを[0]にセットしてるのでしょうか? [1]は値はあるのでしょうか。 preg_match("/^Abc/",$var,$result)の場合は、結果は、 Array ( [0] => Abc )となり、[1]が表示されていません。 何か意味があるのでしょうか? $var="Abcxx xAbcyz uiAc+A eeAc Ac xAc"; preg_match_all("/A(b?)c$/,$var,$result) は 結果 Array ( [0] => Array ( [0] => Ac ) [1] => Array ( [0] => ) ) [0][0]Ac [1][0] [0][0]のAcはeeAcのAcをセットしているのでしょうか? その次のAcとxAcも末尾がAcなのですが、preg_match_allは最後まで検索にいくと思うのですが、なぜセットされていないのでしょうか?

    • ベストアンサー
    • PHP
  • 正規表現の「^」と「$」がうまくいかない

    正規表現の「^」と「$」を使うとうまく働いてくれません。 あるデータの中の、行頭がhttpで始まる1行を取り出したいです。 あるデータ$dataを preg_match_all("/^http(.*?)$/",$data,$result); print_r($result); で出力すると、 ■結果 Array ( [0] => Array ( ) [1] => Array ( ) ) となり、うまくいきません。 preg_match_all("/http(.*?)\n/",$data,$result); やけでこんな感じにやったら、行頭から始まるhttp.....も行頭からはじまらないものもゲットしてすべて出力してくれてしまいます。 行頭から始まるものだけを出力するにはどうしたらいいでしょうか。 php5 UTF-8環境

    • ベストアンサー
    • PHP
  • 正規表現 許可文字列 かつ 指定連続文字列の排除

    わかりにくいタイトルで恐縮です。 初歩的な問題かもしれませんが、もう何日も悩み続けており、ヒントでもいただけると助かります。 たとえば、 正規表現にて 英字のみ(1文字以上) という場合は preg_match("/[a-z]+/i",$string) という風にすればいいと思います。 ここで、英字のみ(1文字以上) しかし、abc という連続文字列があれば該当させない、という場合どういう正規表現を作ればいいのでしょうか? preg_match("/[a-z^(abc)]+/i",$string) みたいなヘンテコなものを作ってみたりしてみたのですが、文法違いなのか、やはり正常には動いてくれません。 ([^a][^b][^c]) なんていうのも違いますし。 狙いは、文字列の最初でも最後でも途中でも、指定文字以外や指定連続文字列がある場合は、エラーを出す、というようなものにしたいのです。 なにかヒントいただければと思います。

    • ベストアンサー
    • PHP
  • IPアドレス拒否処理の正規表現とstr_repla

    下記のようなサンプル(の一部)があるのですが、IF文の条件式の意味が分かりません。 while ( $out = $db->fetch_result($result) ) {  $out['ip_addr'] = stripslashes($out['ip_addr']);  if ( !$ip_banned && preg_match('#^'.str_replace(array('\*', '\?'), array('[0-9]*', '[0-9]'), preg_quote($out['ip_addr'])).'$#', $ip_addr) )  $ip_banned = true; 分解してみました。 ・if ( A ) ・A … !$ip_banned && B ・B … preg_match('#^'.C.'$#', $ip_addr) ・C … str_replace(array('\*', '\?'), array('[0-9]*', '[0-9]'), preg_quote($out['ip_addr']) クオートしたIPアドレスに、「*」か「?」があれば、「数字*」か「数字」に置き換える? さらに、その結果が、$ip_addrの中に、当てはまるか、確認? 意味が分かりません……。 IF文の条件式で、何をしようとしている(と想定される)か、教えてください

    • ベストアンサー
    • PHP
  • 正規表現で文字列の抜き出し

    PHP4で、文字列の中からマッチしたものを抜き出したいのですが、なかなか上手いこといきません。 $str = "<a href=http://www.abc.com/><b>ABC</b>company</a>"; preg_match("/<a href=(.*)>(.*)<\/a>/i",$str,$str_reg); http://www.abc.com/ と <b>ABC</b>company の2つを抜き出したいのですが、 <b>タグが邪魔をして抜き出せません。 どうすれば上記2つを抜き出せるのでしょうか?

    • ベストアンサー
    • PHP
  • 特定の文字で分割する再帰関数

    PHPで、ある文字列に特定の記号があった場合、explodeで分割して、最終的に記号が取り除かれた配列を作成したいのですが、再帰などを用いていたら頭がこんがらがってしまいうまく作ることができませんでした… 試行錯誤の残骸を残すので、アドバイスいただけないでしょうか。 例)「north : we.st:e-a-s-t:south」 →以下の要素を持つ配列にしたい north we st e a s t south ★以下、試行錯誤した残骸です・・・ $data = array("north : we.st:e-a-s-t:south'"); $kigou = array("-","=","',"'",":",";",",","."); $last_result = doDivide($kigou, $data); function doDivide($kigou,$array_words){ //分割配列分ループ foreach($array_words as $word){ //トリム $word = trim($word); //記号分ループ foreach($kigou as $k){ //単語が記号にマッチするか調べる $match_result = preg_match("/" . $k . "/", $word); if ($match_result !== 0) { //マッチした記号で配列に分割する $divided_array = explode($k, $word); //配列に空白があったら削除する $divided_array = array_diff($divided_array, array( "" )); //再帰的に呼び出す $result[] = doDivide($kigou, $divided_array); } } } //分割されきった単語を返す return $result; }

    • ベストアンサー
    • PHP
  • PHP:preg_match_allで複数条件指定

    preg_match_allで複数条件を設定する方法についてお尋ねします。 環境 PHP:5.1.6 MySQL:5.0.77 --------ソース例------------------------------------------ <a href="1000/23">1: 【国語】接続後について (授業1) (20)</a> <a href="1000/26">2: 【数学】分数 (206)</a> --------------------------------------------------------- 上記のようなHTMLソースを分解してMySQLに登録することを考えています。 (1行目) 1000/23 | 1 | 【国語】接続後について (授業1) | 20 (2行目) 1000/26 | 2 | 【数学】分数 | 206 という形に a hrefの中身 |スレッド番号 | タイトル | コメント数 4つに分解してMySQLに登録します。 正規表現を学んで、個別にデータを取り出すことはできました。 以下に作成したソースを記載します。 $contents='<a href="1000/23">1: 【国語】接続後について (授業1) (20)</a><a href="1000/26">2: 【数学】分数 (206)</a>'; preg_match_all( '/<a href="(.*?)">/su', $contents, $match ); foreach ( $match[ 1 ] as $var ) { echo htmlspecialchars($var)."<br>"; } preg_match_all( '/">([0-9]*?):/su', $contents, $match2 ); foreach ( $match2[ 1 ] as $var2 ) { echo htmlspecialchars($var2)."■<br>"; } preg_match_all( '/[0-9]: (.*?)\([0-9]*\)<\/a>/su', $contents, $match3 ); foreach ( $match3[ 1 ] as $var3 ) { echo htmlspecialchars($var3)."■<br>"; } preg_match_all( '/\(([0-9]*?)\)</su', $contents, $match4 ); foreach ( $match4[ 1 ] as $var4 ) { echo htmlspecialchars($var4)."●<br>"; } 【実行結果】 1000/23 1000/26 1 2 【国語】接続後について (授業1) 【数学】分数 20 206 1行ずつMySQLに登録したいので preg_match_all( '/条件1,条件2,条件3,条件4/su', $contents, $match ); のような形で指定して個々の値を下記の変数に入れることは可能でしょうか? ループ処理開始{ $url $num $title $res //MySQLに接続 //データ登録 }

    • ベストアンサー
    • PHP
  • 正規表現 先頭一桁をマッチさせるには

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

    • ベストアンサー
    • PHP
  • 正規表現の文字化け?で困っています。

    preg_matchで、条件を変数で定義したいのですが、うまくいきません。 すみませんが、教えてください。 $str = "hoge.php?a=10&b=3"; から"a=10"をマッチさせる場合。 preg_match('/^(.*(\?|&))(a=.*)(&.*)*$/', $str); で、一応うまくいきます。 マッチ条件を状況により変更させるため、まずは、 $con = "'/^(.*(\?|&))(a=.*)(&.*)*$/'"; preg_match($con, $str); のようにしたいのですが、なぜかマッチしてくれません。 すみませんが、対策方法の分かる方がいらっしゃましたら、ご教授の程、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 特定の要素を抜き取って連想配列へ

    例えば、 $hoge = "%_A_%あ%_A_%%_B_%123%_B_%%_C_%%_C_%%_D_%hogehoge%_D_%"; というようなデータがあった場合、 %_?_% の?部分を連想配列のキーとして、 そのはさまれた部分を前途キーの内容として格納したいのですが、 どのようにすればいいでしょうか? (%_?_%~%_?_% において?の組み合わせは必ず単一でしか存在しません) 求めている結果は $array['A'] => あ $array['B'] => 123 $array['C'] => //空要素 $array['D'] => hogehoge のような形です とりあえず if (preg_match("/%_([A-Z])_%(.*)%_$1_%/" , $hoge ,$matched) ){ // $matchedを解析して$arrayに割り当て } とすればいけるかな、と思いやってみましたがパターンマッチの条件にすら当てはまらず撃沈 preg_matchのマッチ条件内ではまだ$1が使えないようでした 環境はPHP4です よろしくお願いします

    • ベストアンサー
    • PHP

専門家に質問してみよう