• ベストアンサー

正規表現:文字列の最後にマッチした文字以外を取得

phpを使って、正規表現と関数で文字列の編集を行っているのですが いい方法が思いつきません。 やりたいことは以下のようなことです。 $find ="\n"//マッチさせたい文字 $string = "リンゴ、空、\nミルク、車\n";//検索対象 $str=関数($string);//わからない部分 print($str); ↓表示結果 リンゴ、空、\nミルク、車 文字列のインデックスの0から、最後にマッチした文字列の直前までを取得するにはどうしたらよいでしょうか。 またこのような表現には何か名前がついていますか? ご教授ください。

  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

preg_match('/^(.*)\n/s', $string, $matches); $str = $matches[1]; preg_match の第3引数を指定すると、その変数にマッチした文字列が格納されます。 正規表現中に括弧でくくられた部分があると、その部分が$matches 配列の添え字1以降にキャプチャされますので、 行頭から\nまでをマッチさせる正規表現を指定した上で、必要とする「行頭から最後にマッチした文字列の直前」部分を括弧でくくってやれば、その内容が取得できることになります。 http://php.net/manual/ja/function.preg-match.php

webwebwebweb
質問者

お礼

なるほど! 正規表現の括弧の使い方を何となく 式のグルーピングとして使っていたのですが 検索した値を参照するために使うのですね。 ありがとうございます。 助かりました。

関連するQ&A

  • ''で囲まれていない文字列にマッチする正規表現

    下記のような文字列($str)に対して置換を行い、 my $str = qq{ AAA = BBB - 'CCC' }; $str =~ s/★正規表現★/sprintf("DDD(%s)",$1)/xmsge ; 変換後 $str = DDD(AAA) = DDD(BBB) - 'CCC' ; を実現する★正規表現★を書きたいと思っています。  ・AAA,BBB,CCCは[\w]で構成される文字列です。 ですが、シングルクォーテーション('')で囲まれていない文字列にマッチする正規表現が書けなく困っています。 一度、シングルクォーテーションで囲まれているものも含めて全てDDD()をつけて、そのあとで、シングルクォーテーションを含むものは元に戻すことでやりたいことは実現できているのですが、1行で実現できる方法を探しています。 アドバイスよろしくお願いします。

    • ベストアンサー
    • Perl
  • 正規表現で「円(価格)」文字列をマッチさせるには?

    お世話になります。 テキストファイル(UTF-8エンコード)内の、 12,345円(価格) という文字列内より、 正規表現(ActivePerl)で、 円(価格) 文字列だけをマッチさせようとしています。 たとえば、 my $Str = "12,345円(価格)"; if($Str =~ /.*\d円(価格)/){ # マッチOK処理 } または、 if($Str =~ /円(価格)/){ # マッチOK処理 } など、いろいろ試しましたが、 マッチしない状況です。 そこでご質問ですが、 どのようにすれば、マッチ出来ますでしょうか。 以上になります。 宜しくお願いいたします。

  • 正規表現。行頭が○○以外にマッチさせたい。

    正規表現を勉強しています。行頭がxyzという文字列以外をマッチさせたいと思っています。行頭にマッチさせるには"^xyz"と理解できます。[^xyz]とやるとx,y,z以外の文字列にマッチするのもわかります。ただ、これだと 123 xyz の文字にもマッチしていまいます。行頭がxyzで続く文字列以外にマッチさせる正規表現はどうかけばよろしいでしょうか?

  • grepにマッチした正規表現の文字列を取得したい

    grepにマッチした正規表現の文字列を取得し、マッチした文字列を 一覧で取得したいのですが、方法がわかりません。 ※例 grep [0-9][0-9][0-9][0-9][0-9] 検索ファイル名 > 出力ファイル名 不明点あればお知らせください。 よろしくお願いします。

  • 正規表現で特定の文字集団以外の文字列があるとマッチする書き方

    正規表現で特定の文字集団以外の文字列があるとマッチするというものです。"ABCDEFGHIJK0123456789"以外の文字が1つでもあればそれにマッチし、$1,$2...にそれらを格納する書き方が知りたいです。 たとえば、 "ACKL1-BZaF" なら、マッチして、そして $1にL $2に- $3にZa あと、正規表現の真髄は、よくNFA,DFAの違いがわかれば良いなど書いていますが、身近にこの違いがはっきるわかる事例ってありますか?

  • [15]にマッチする正規表現

    [15]にマッチする正規表現 [15] にマッチする正規表現を書きたいのですが、うまくいきません。。。。 簡単だ、と思ったのですが。。。 expr "$DATA1" : .*\[15\].* と書くと、中の数字が15じゃなくてもマッチしてしまいます。 expr "$DATA1" : .*15.* であれば"15"にマッチしますが、対象の文字列の都合上、カッコでも識別する必要があり 困っております。[と]をエスケープする目的で\をつける、と思っているのですが、何か 思い違いをしているのでしょうか。

  • 正規表現で文字列を区切りたい

    PHPで、正規表現で文字列を分割する方法がわかりません。 やりたいことは、 1|ねこ|2|こあら|3|りす という文字列を、 1|ねこ 2|こあら 3|りす というように、直前の文字が数字でない|で区切りたいです。 区切るための関数は、mb_splitを考えています。 http://php.benscom.com/manual/ja/function.mb-split.php 調べていて、以下のページに書かれている話が近いのかなと思うのですが、 そこで述べられている正規表現の仕組みがよく分からないでいます。 http://okwave.jp/qa1849763.html ご教示よろしくお願いします。

    • ベストアンサー
    • PHP
  • 「マッチしない」正規表現の書き方

    正規表現について、おたずねします。 文字列 abc,def,ghi のいずれかにマッチする正規表現は (abc|def|ghi) ですよね。 それでは、「abc,def,ghi のいずれにもマッチしない」正規表現は、どう書けばいいのでしょうか? あちこち調べましたが、どうしてもわかりません。 ただし、if $a =~ /(abc|def|ghi)/ などで、=~ を !~ に直す、というのはナシです。あくまでも右辺の式の中で表現したいのですが…

  • 正規表現でマッチさせたい文字列の指定方法

    正規表現でマッチさせたい文字列の指定方法について こんにちは。正規表現について教えてください。 秀丸エディタでgrepする時に先頭行に 『ファイル名(行数): 』という文字列が 先頭行に入りますが、これを正規表現を使用して消したいと思っています。 具体的には以下のような表現ですが、どのように指定するのが正しいでしょうか。 いくらかテストしているのですが、なかなかうまくできず困っています。 消したい文字列 test.log-110411-01.bak.text(38): よろしくお願いします

  • 、"(ダブルクォーテーション)で囲まれている文字列を正規表現で取得

    質問させてください。 abcdef -s "xsalkjsdflsd#$%_asdasdlasdlakjsd&=Daskdjh" asdakjsd のような文字列があります。 これの、"(ダブルクォーテーション)で囲まれている文字列を取得したいのですが、正規表現がうまくいきません。 取得結果としてはは、xsalkjsdflsd#$%_asdasdlasdlakjsd&=Daskdjh の部分がほしいです。 preg_match('/"([.*])"/', $str, $matches);とやったり preg_match('/\"([.*])\"/', $str, $matches);とやったり preg_match('/\"([.*?])\"/', $str, $matches);とやったりしたのですが、 どうしても$matchesにほしい結果は入っていません。 どのような正規表現で取得可能でしょうか? 何卒ご教授ください。

    • ベストアンサー
    • PHP

専門家に質問してみよう