文字列中間位置マッチアサーション表現

このQ&Aのポイント
  • 文字列の中間位置にマッチするアサーション表現の正規表現を教えてください。
  • 指定された正規表現パターンと文字列が与えられた場合、末尾の連続した数字の先頭にマッチするアサーションを取得したいです。
  • 後読みを用いるため、空白の数が任意の場合にも対応した正規表現の書き方に困っています。
回答を見る
  • ベストアンサー

文字列の中間位置にマッチするアサーション表現

文字列の中間位置にマッチするアサーション表現 qr{ ^ \w+ \s+ \d+ \s+ \d+ $ }xms の規則で $strに文字列が複数行格納されています。 スペースの個数に関しては任意です。 my $str = <<EOF ; BBB 0 00 AAA 1 01 AAA 2 10 : EOF 上記例で行頭がAAAで始まる、末尾の連続した数字の先頭にマッチする正規表現を教えて頂けないでしょか? AAA 1 01 の01の先頭に位置にマッチするアサーションを知りたい 後読みを用いたいのですが、空白の数が任意のためうまく書けずに困ってます。

  • Perl
  • 回答数2
  • ありがとう数7

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

バージョンにもよるんだけど, \K って使えない?

参考URL:
http://fleur.hio.jp/perldoc/perl/5.9.5/pod/perlre.mix.html#Extended_Patterns
renkado
質問者

お礼

ありがとうございます。 実行環境が5.8のため、\Kを使うことは出来ないのですが大変参考になりました。 5.9での改版を全く知らなかったので勉強になりました。 やはり5.8以前の環境では後読みの非固定幅対応は難しいようですね。 見切りをつけて、他の方法を検討したいと思います。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

とりあえず「何をしたいのか」が見えないんだが.... その位置を知って, どうするの?

renkado
質問者

補足

説明不足で申し訳ありません 目的は AAA 1 01 の01部分を置換することです。 処理を複数行に分けて行うことであれば、 実現できているのですが、 今後のために、このような位置にマッチする正規表現を学びたいと考えています。 拡張正規表現を組み合わせれば、これを実現できるのではと思っているのですが 難しくお知恵を拝借したい次第です。 イメージでは、知りたい位置にマッチする正規表現を$reとしたとき  $str =~ s/$re ([01]+) $/sprintf("xxx(%s)", $1)/xmsg ; 等とダイレクトに置換することです。

関連する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する時に先頭行に 『ファイル名(行数): 』という文字列が 先頭行に入りますが、これを正規表現を使用して消したいと思っています。 具体的には以下のような表現ですが、どのように指定するのが正しいでしょうか。 いくらかテストしているのですが、なかなかうまくできず困っています。 消したい文字列 test.log-110411-01.bak.text(38): よろしくお願いします

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

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

    • ベストアンサー
    • PHP
  • 【正規表現】コメントアウトされていない文字列のマッチ

    お世話になっております。 あるファイル群にgrepをかけて結果を取得したいのですが あと半歩という所でつまづいています。 正規表現の考え方のご示唆をいただけませんでしょうか。 宜しくお願い致します。 ■やりたいこと コメントアウトされていない文字列のマッチ ■対象文字列 1行目:ほげ 2行目://ほげ 3行目:// これは否定 ほげ 4行目:ほげ //ここにコメントがはいるとひっかからない(><) ■コメントアウト文字 // 1行目と4行目の「ほげ」をマッチさせたいのです。 正規表現の先読み否定を使って ^(?!//.*)ほげ$ 行頭から、「//」が後に続かなくて「ほげ」がある行末 とやってるのですが、 4行目がひっかかりません。 (?!//.*)の部分で、「//」から「ほげ」までを否定している為だと思うのですが、どのように考え、どのように記載すればスマートでしょうか。 お忙しい所恐縮ですが アドバイスいただければ幸いです。 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • preg_match : マッチした位置の取得

    phpにおける正規表現で、パターンにマッチした位置を取得したいのですが、引数で検索する位置を指定することはできても容易に取得する方法がみあたらないので困っています。 マッチした文字列を strstr() を使って位置取得するという方法しか思い浮かばないのですが、どうにかならないでしょうか。

    • ベストアンサー
    • PHP
  • Perlの文字列置換について

    Perlで文字列置換の業務をすることになりした。 Struts1からStruts2のJSPのタグの変換です。 (1)html:textarea property="aaa" styleClass="bbb" (2)s:textarea name="aaa" cssClass="bbb" (1)から(2)に変換したいです。 「html:textarea」が「s:textarea」に対応しており、その属性の「property="aaa"」が「name="aaa"」に対応、 「styleClass="bbb"」が「cssClass="bbb"」に対応するといった内容です。 aaaとbbbは任意の文字列 if ($str =~ /html:textarea/ ) { $str =~ s/html:textarea/s:textarea/; $str =~ s/property=\"(.+)\"/name="$1"/; $str =~ s/styleClass=\(.+)"\"/cssClass/; というように参考書を元に作成してみたのですが、変換は行われるものの、属性のpropertyとstyleClassの順番が逆だったり、ここに記載していない他の属性を間に入れたりすると変換ができません。 どなたか教えて下さい。

    • ベストアンサー
    • Perl
  • 文字列中の任意の位置の文字取得

    VB6の勉強をしております。 OSはWindowsXPです。 すごく簡単な質問なんですが、C言語のように、文字列中の任意の位置を指定する方法はVB6には無いのでしょうか? 例) C言語:str[1] 添え字で指定出来る VB6:???  思いつく方法はMidを利用し、任意の位置の文字を取得する方法なんですが、それしか無いのでしょうか? 以上、よろしくお願いいたします。

  • @がすでに含まれちゃってる文字列の操作

    perlで文字列中に@を使いたいときは ¥などでエスケープすればよいと思いますが、 (パラメタで受け取った)すでに@が入っている文字列の @までの文字列を切り取るにはどうすればよいでしょう。 どうぞ教えてください。よろしくお願いいたします。 たとえば、 $str1="aaa@bbb"; $str2=substr($str1,0,3); とやってもエラーになってしまいます。

    • ベストアンサー
    • Perl

専門家に質問してみよう