• ベストアンサー

正規表現について

任意の文字は「.」であらわされるようですが、とほほさんのサイトによると、\nは除いた任意の文字とあります。\nも含んだ任意の文字はどう表現すればいいのでしょうか? .|\n でいいんでしょうか? テキストファイルを$dataに読み込み、<start>と<end>にはさまれた改行を含む文字列を取得しようと、 if($text =~ /<start>(.*)<end>/){  print $1; } としたのですが、if文に引っかかりません。さらに、 if($text =~ /<start>([.\n]*)<end>/){  print $1; } かな?と思いましたがこれもできませんでした。 何かいい方法はないでしょうか?

  • Perl
  • 回答数3
  • ありがとう数6

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

  • ベストアンサー
  • meeee
  • ベストアンサー率31% (6/19)
回答No.1

もしファイルからwhile(<>)で読み込むとしたら、そもそも<start>aaa\nbbb<end>のような場合、 <start>aaa と bbb<end> の2行になってしまいませんか? 対象のファイルが十分小さいことが保障されている場合を除いて、ファイル全体を変数に読み込むのを前提にするのは、危険だと思いますので。 そうすると、 <start>(.*)<end>の場合は$1、 <start>(.*)\nの場合は$1\nを一時格納して、フラグを立てて、(.*)<end>が来るまでを格納する、のようにするのがよいような気がします。 1行に <start>aaa<end><start>bbb<end> となっている場合なども考えると、正規表現一発!というわけにはいかず、<start>から以降<end>が来るまでを変数に格納していく、という方法になるのではないかという予感がします。

その他の回答 (2)

  • fo-o
  • ベストアンサー率50% (4/8)
回答No.3

if($text =~ /<start>([\S\n]*)<end>/){  print $1; } でどうでしょうか? タブとかも含めるなら ([\S\s]*) で。

  • nightowl
  • ベストアンサー率44% (490/1101)
回答No.2

こんばんは。 ファイル全体をメモリに読み込んで構わないのだったら楽な方法はあります。 この場合、「/.../」の後ろに「s」をつける「単独行モード」でマッチさせます。 /s には、複数の行をまとめて一つの行として扱う働きがあり, ドットは改行も含むすべての文字とマッチするようになります。 >$text =~ /<start>(.*)<end>/ を $text =~ /<start>(.*)<end>/s のように書き直して試してみましょう。 オライリーの「詳説 正規表現 第2版」(Jeffrey E. F. Friedl 著)には このあたりの詳細が述べられていますので、ご一読をお勧めします(第7章)。 http://www.oreilly.co.jp/BOOK/regex2/ なお、正規表現のみに頼った方法では構造を持った文書、 例えば「<start>外側です<start>ここは内側<end>また外に出た<end>」のように タグが入れ子になっている文書には通用しないでしょう。

参考URL:
http://www.kt.rim.or.jp/~kbk/perl5.005/perlre.html,http://www2.famille.ne.jp/~akio1998/l_grep.html

関連するQ&A

  • 独自タグを正規表現で取る方法

    今下のような文字列から、正規表現を使って##LOOP_START##から##LOOP_END##の間の文字列を抜き出そうとしています。 $target = '##LOOP_START##123 456789##LOOP_END##'; コードは以下です。 preg_match_all('/##LOOP_START##(.+?)##LOOP_END##/', $target, $matches); しかし、戻り値は0が帰ってきており、何も取得できません。 いろいろ調べたていたのですが、何か悪いのかさっぱりわからないので 投稿させていただきました。 ちなみに $target = '##LOOP_START##123456789##LOOP_END##'; のように途中が改行されていなければ 問題なく取得できました。 改行も含めてどうやったら抜き出せるでしょうか。。 よろしくお願いしますm(_ _)m

    • ベストアンサー
    • PHP
  • Rubyにおける正規表現(一致しない)

    Rubyを使って、テキスト処理をやっています。 どうしても、うまく行かないところがあります。 サジェスチョンをお願いします。 正規表現にて、 2つの条件フラグが成立していて、かつ、特定の文字列を含まないという条件です。 1行の内容は、textに入っています。 if (myFlag1==1) && (myFlag2==1) && (!/abc def/) then xxxxxxxx end (!/abc def/)は、perlでの表現です。Rubyでは、少なくとも (!/abc def/=~text) かな、と考えましたが、ダメでした。 (/abc def/!=text) でも、だめでした。 宜しくお願いいたします。

  • 正規表現で・・・

    正規表現で文字列の検索をしたいのですが、 いまいちわかりづらくて困ってます。 Message:What if the nuclear techonology wich has been developed by the human race should end up in ruining ourselves?/E/ というような文字列をMessage:をキーにして /E/までを検索したいのです。当然 行間には改行コード 入ります。

    • 締切済み
    • PHP
  • 正規表現でOR

    正規表現について困っています。 $text = '&a=000&b=111&c=222'; mb_ereg('&b=(.*?)&', $text, $result); 上記のように、スタートを&b=とし、エンドを&とすれば、'b=111' の中の '111'  は抽出できます。 ところが、$textには次のようなパターンもあります。 $text = '&a=000&b=111'; この場合、エンドを示す文字が文末のために存在しませんので、 mb_ereg('&b=(.*)', $text, $result); とやれば抽出できます。 やりたいことは、上記の2つのパターンに対応する正規表現を1行で記述したいのです。ORを表す表現を調べていろいろ試したのですが、うまくいきません。 よろしくご指導のほどお願いいたします。

    • ベストアンサー
    • PHP
  • 正規表現についてご教示お願いします。

    正規表現についてご教示お願いします。 文字列:111,222,STR1234567END,STR222567END 上記文字列にて "STR1234567END"の部分を取り出したいのですが 正規表現:STR.*END で指定しますと "STR1234567END,STR222567END" と取得されてしまい上手く出来ません。。。 他にもいろいろ試しているのですが "STR1234567END"と取得できません。 どうかご教示頂けたらと思います。 よろしくお願いします。

  • 正規表現による改行の置換

    Windowsで正規表現ができるテキストエディタ(NoEditer)を使っており、次のような改行で区切られた文を最後のピリオッドまでをつなげたいと思っています。例文ではX,Y,Z.の直後には改行が入っており、目的はAaaaXBbbbYCcccZ.と一文につなげることです。 [例文] AaaaX BbbbY CcccZ. 正規表現で \n[^(\.\n)] としてを空欄に置換すると2行目以降の頭が消えてしまいます。---> AaaaXbbbYcccZ.  文頭の文字が消えずつなげる方法を教えて下さい。

  • 正規表現で複数行を検索したいです。 VB.NET

    VB.NETの正規表現で2つの文字列に囲まれた複数行の部分を取得したいです。 START ABCDE FGHIJ END 上記のようになっていた場合に ABCDE FGHIJ を取得したいです。 対象は START END のようになっていたり、 STARTEND のようになっていたりする場合にも対応できるようにしたいです。 色々試してみて .*?(\r\n)*? で良いように思ったのですがだめなようです。 もうしわけございませんが、ご教授いただければ幸いです。

  • ACCESS VBAでの正規表現チェックについて

    いつもお世話になっています。 現在ACCESS2003で開発を行っているのですが、文字の入力チェックで悩んでいます。 正規表現チェックを使用し 半角英数字と"-", "_", "!", "@", "+", "/", "*"以外の文字が入力されればエラーメッセージを表示させようとしているのですが、うまく動作しません。 ●現在の処理 '検証結果フラグ b_error = True '入力許可文字列 s_ok_text = "*[”正規表現”]*" '入力文字列が空で無い場合はチェック処理を実行する If Not IsNull(”入力文字”) Then If ”入力文字” Like s_ok_text Then '入力許可文字列以外が含まれていた場合はエラーを返す b_error = False End If End If s_ok_textに入力可能文字を設定しているのですが、上記入力許可文字の設定の仕方がわからない状況です。 正規表現のチェックに詳しい方がいましたら、上記チェックの方法をご教授頂きたく思います。 宜しくお願い致します。

  • 正規表現  マッチさせれない C#

    下記のもの全体にマッチさせる表現を考えていたのですが、 どぉしても思いつきません。 まだまだ正規表現についてわかっていないのでご教授いただけないでしょうか。 /// <summary> /// メソッド1 /// </summary> /// <param name="Out">1:入力文字,2:出力文字)</param> /// 文字列     の部分は行が増えたり減ったりするので /// と文字列と改行文字で1つのくくりにして それを任意の回数繰り返しでマッチさせようとしています。 ([/// .*] \r\n)*   (///[.<>/]* \r\n)*  など試しましたがマッチしません。 そもそもこのようなものをマッチさせること自体無理なのかもしれませんが その点も含めご教授お願いいただけますでしょうか。言語はC#です

  • 正規表現でURLだけを取り出したい

    正規表現でURLだけを取り出したいのですが、うまくできなくて困っています。 あああああ http://www.yahoo.co.jp abcdefg if ($_=~/(.*)http(.*)[  \n](.*)/){ print $2 } とやると http://www.yahoo.co.jp abcdefg となってしまいます。 http://www.yahoo.co.jp だけを取りたいのですが・・・ []のなかは 半角スペース、全角スペース、改行 です。

    • ベストアンサー
    • Perl

専門家に質問してみよう