• ベストアンサー

splitでほしいものが消えてしまう・・・

文章列を1行取ってきて、そのなかから(1)《←全部全角です》をとってきたいとおもい、プログラムを書いたのですが、(1)だけ消えてしまいます。逆にこれだけを残すことはできないのでしょうか? 今までCでポインタでやってたんですけど、今回Perlを使うことになり、悪戦苦闘しています。 よろしくお願いします。 ↓のように書きました。コードはSJISです。 @list = split(/\((?:\x82[\x4F-\x58])\)/ ,$hows[$j]);

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

したいことがもうひとつわからないので、勘違いしているかもしれませんが @list = ($hows[$j]=~ /\((?:\x82[\x4F-\x58])\)/g); でいいような気がします。

11sakisaki11
質問者

お礼

説明不足ですみません。 やりたいことは、つまりは文章の中で、何回「(全角数字)」という表記が出てきるのか、括弧の中の数字はどんなものが使われているのかと調べたいのです。 で、$hows[$j]にその文章を入れ込んであるので、そのなかから「(全角数字)」を切り出して、@listに格納したかったのです。 上記の方法でうまくいきました!とりだしたいときはこうかけばよいのですね…ありがとうございました!!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

noname#11136
noname#11136
回答No.4

全角のカッコを\でエスケープする必要はないと思います。また、全角の0から9の指定は[0-9]でもできます (漢数字の〇から九は[〇-九]ではだめですけど)。 @list = split /([0-9])/, $hows[$j]; これだとセパレータの「(1ケタの全角数字)」はもちろんlistの要素になりませんが、 No.2の方が書かれたようにセパレータの一部をカッコで囲むと、その部分も要素になります。 @list = split /(([0-9]))/, $hows[$j]; もし、セパレータ?というかパターンを要素にしたい場合は、No.3の方が書かれたように @list = $hows[$j] =~ /([0-9])/g; 「(1ケタの全角数字)」を削除するのであれば、s///gでもいいのではないかと思います。 $hows[$j] =~ s/([0-9])//g; splitは3つ目の引数として、-1 (負数)を指定しないと、後ろにある空の要素を捨ててしまうので、それでlistの要素数が減って、プログラムの別のところで問題が起こっているのかもしれません。 @list = split /([0-9])/, $hows[$j], -1;

参考URL:
http://www.unix.org.ua/orelly/perl/prog/ch03_155.htm
11sakisaki11
質問者

お礼

Windowsでやってるせいかわかりませんが、普通に全角で[0-9]と指定してもできなかったので、SJISコード表示を上記のようにしていたのです。原因はよくわからないんですけど(^^; いろいろな手法を教えていただいてありがとうございます!

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

splitは、パターンで指定したモノがデリミタ(分割する記号)だとするので、デリミタ自体はリストに含まれません。 デリミタも結果としてのリストに含める場合には パターンを()で囲むことでリストに含めることができます。 つまり @list = split(/(\((?:\x82[\x4F-\x58])\))/ ,$hows[$j]); とします。 単に、パターンにマッチするものを取り出すのだったら、splitを使うのがおかしい様な気がします。

全文を見る
すると、全ての回答が全文表示されます。
  • sunasearch
  • ベストアンサー率35% (632/1788)
回答No.1

(@listの要素数-1)個の(1)があると考えて、 リストを作ってはどうでしょうか? スマートではないのかも。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 全角文字列から英数字のみ抜き出す方法は?

    Perl 文字コード sjis 以下のように、全角文字列の中から、全角英数字のみを抜き出したいのですが、良い方法はありますでしょうか。 あア亜ABC-123 ↓ ABC-123 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • splitが思うように動きません助けて下さい。

    文字列から、明細と金額にわけてそこから検索できるプログラムを作っています。 テスト用に下記サンプルを作ったのですが、検索明細($moneyvalue)をコーヒーに した場合のみ、値が戻ってきませんでした。 そこで、中のsplit部分を表示するようにしたところ ★収入=-10000. ★電車=+1000. ★コ=. ★[ヒ=. ★[=+2000. ★雑誌=+240. ★=. ★その他=+500. 0 このように コーヒーの部分だけ上手くsplitが動いていないことが分かりました。 しかしココから手詰まりでどのように直せばいいのか分かりません。 想定される結果 ★収入=-10000. ★電車=+1000. ★コーヒー=+2000. ★雑誌=+240. ★その他=+500. 2000 このようにするにはどうしたらいいのか、分かる方おりましたら教えて下さい。 なお、当方はperl初心者です(涙) ----以下サンプルコードです---- #! /usr/local/bin/perl use Encode qw(encode_utf8); use CGI; my $moneyvalue = "コーヒー"; my $moneyline = "収入-10000,電車+1000,コーヒー+2000,雑誌+240、その他+500"; print &chkmoneyValue($moneyline,$moneyvalue); exit; #==============================================================================  sub chkmoneyValue { my ($moneyline , $moneyvalue)=@_; my $lp=0; my $flg=0; my @data= split(/[、,]/, $moneyline); my $datavalue = 0; foreach my $wdata (@data) { $wdata =~ s/\+/\,\+/; $wdata =~ s/\-/\,\-/; my @data2 = split(/[,]/, $wdata); print "★$data2[0]=$data2[1].\n"; if($data2[0] eq $moneyvalue){ $datavalue=$data2[1]; last; } } return $datavalue; }

    • ベストアンサー
    • Perl
  • Perl UTF8 での全角カタカナチェック

    ■環境 Linux, Perl 5.8 です。 画面(HTML)と処理(Perl)は分けて作成しており、Templateモジュールで画面表示を行っています。 HTMLもPerlも文字コードはUTF-8です。 ■質問 フォームからうけとった文字列で全角カタカナと特定の全角記号以外はエラーとする 入力チェック処理(正規表現)がうまくチェックを行ってくれません。 SJISだと以下のような書き方があるそうなのですが、UTF8での書き方がわかりません。 ・SJIS if($data !~ /^(?:\x83[\x40-\x96])+$/){ $mes="全角カナ以外の文字が指定されています"; } UTF8での書き方を教えて頂きたいです。 なお、許容する全角カタカナと特定の全角記号は以下のとおりです。 ========================================================== アイウエオカキクケコサシスセソタチツテトナニヌネノ ハヒフヘホマミムメモヤユヨラリルレロワヰヱヲン ァィゥェォッャュョヵヶヴガギグゲゴザジズゼゾダヂヅデド バビブベボパピプペポーヽヾ ========================================================== ご教授お願い致します。

  • Javaのsplit()メソッドについて

    Java初心者です。 あるテキストエリアに入力された文字列が、 X行以上かどうかを判定するために、 split("/r/n",-1)で、1行ごとに区切ってString[]に格納し、 その配列数の要素を確認し、X以上かどうかを判定しようと思っています。 ただ、 空行も1行と判定したいのですが、split("/r/n",-1)の場合、 空行も1要素としてくれるのでしょうか? <例> AAA<CR><LF> BBB<CR><LF> <CR><LF> CCCC<CR><LF> <CR><LF> の場合、3行目や5行目も1要素とみなし、5行として判定してほしいです。 よろしくお願いいたします。

  • splitについて教えてください。

    @name=("ひろと","けいた","はやと","りゅうすけ","とらのすけ"); @str=@name; print "@str\n"; @str=join(";",@str); print "<br>@str\n"; @str=split(/;/,@str); print "<br>@str\n"; 上記のような配列を作成したプログラムを実験で作ってみました。(一部抜粋です。htmlで表記されるようにしています。) ブラウザで見てみると、以下のようになりました。 ひろと けいた はやと りゅうすけ とらのすけ ひろと;けいた;はやと;りゅうすけ;とらのすけ 1 その中の3行目の「1」とだけ表示された理由がわかりません。 splitにより、joinで作成された一つの文字列を、 再び「;」で区切って要素数が5つの配列に戻したかったのですが、 なぜか1と返されてしまいました。 splitの使い方を教えていただけないでしょうか。

    • ベストアンサー
    • CGI
  • Perl UTF8 での氏名チェック

    ■環境 Linux, Perl 5.8 です。 画面(HTML)と処理(Perl)は分けて作成しており、Templateモジュールで画面表示を行っています。 HTMLもPerlも文字コードはUTF-8です。 ■質問 フォームからうけとった文字列で以下の文字以外をエラーとする入力チェック処理(正規表現)をUTF8用に作りたいです。 ・漢字 ・ひらがな ・全角記号(ー-のみ) ・全角スペース ・全角カタカナ(http://okwave.jp/qa4997637.html) 直前の全角カタカナチェック(http://okwave.jp/qa4997637.html)と類似しているのですが、別に質問させていただきました。 色々探してみたのですが、UTF8でそのようなチェックモジュールが見つからず、 正規表現で書くしかないのかと思い、正規表現でも書いてみましたがうまくいきませんでした。 チェックモジュールが存在するのであれば教えて頂きたいです。 または、以下のようなシンプルな書き方(以下はUTF8ではなくSJISの全角カタカナチェックですが)があればご教授頂きたいです。 また、文字コードの対応(例えば\x40が何の文字にあたるか)がUTF8で分かれば応用がきくのですが、 それも見つからなかったので、対応表、調べ方をご存知の方がいらっしゃったらご教授頂きたいです。 ・SJISの全角カタカナチェック if($data !~ /^(?:\x83[\x40-\x96])+$/){ $mes="全角カナ以外がありますよ"; } よろしくお願い致します。

  • 改行コードから改行コードまでをスプリットして配列に取り込む方法を教えて

    改行コードから改行コードまでをスプリットして配列に取り込む方法を教えてください。 ファイル「sample.txt」の中に 文字列A 文字列B 文字列C 文字列D 文字列E 文字列F 文字列G と書かれていたとします。このファイルを開き、配列@listに @list = 文字列A\r\n文字列B\r\n文字列C\r\n,文字列D\r\n文字列E\r\n,文字列F\r\n文字列G\r\n となるようなコードを教えてください。 要は二重改行コード\r\n\r\nをスプリッタとして複数の行を配列に取り込む方法です。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • 外部テキストファイルから座標データを読み込み,その座標にムービークリップを配置する

    タイトル通りなのですが, 外部テキストファイルから座標データを読み込み, その座標にムービークリップを配置させたいと考えています. 外部テキストファイルは name=0, x=10, y=20 &name=1, x=11, y=21 &name=2, x=12, y=22  ・      ・   ・  ・      ・   ・  ・      ・   ・ として,1行ごとに名前と座標のデータがあります. 行数は可変で,行数だけムービークリップを配置したいと考えています. いろいろ調べてsplit関数などを使えば1行ごとに読み込めそうだということはわかりましたが, オブジェクト指向はほとんど使ったことが無いので悪戦苦闘しています(C言語はそれなりに使えます). どのようにすれば上記のようなプログラムをかけますでしょうか. どなたかよろしくお願いいたします. 環境 FLASH MX, WINDOWS XP

    • ベストアンサー
    • Flash
  • 【証明】この行列の逆行列は?

    i行目、j列目の要素が1/(i+j)である正方行列は正則であることを証明せよ。また逆行列のすべての要素が整数であることを証明せよ。 ためしに、n=1,2,3,4の場合のdeterminantを計算してみたのですが、それぞれ、1/2,1/72,1/43200,1/423360000と切りのいい答えになりました。規則性がありそうなので一般化できないかと悪戦苦闘してみたのですが手がかりがつかめません。よろしくお願いします。

  • python 文字列処理

    たとえばlink[j]に文字列 a,b が入っている場合、その文字列をsplitでわけ、関数で使う文字列とする場合を考えました。 (1) [cols1, cols2] = link[j].split(',') actor = scene.Actor(cols1) しかし、関数Actorは()内が英数字なら""、日本語ならば''がついた文字列でければ動きません。 link[j]はファイルx.txtから読み取った文字列です。 actor = scene.Actor("a") では実行が可能です。 ファイルx.txtの内容を "a","b" にしても(1)のプログラムでは実行不可でした。 この場合プログラムをどのようにかえればいいのでしょうか。 文章もプログラムの腕もなくてもうしわけないのですが、ご回答できるかた、どうぞよろしくおねがいします。