• ベストアンサー

指定しない文字数から右から2番目より左の文字列を抜き出す

まじすんません、ある程度プログラムは作れるまでにはなったのですが、正規表現が難しくて、何時間やっても無理でした。大変誠に申し訳ありませんが、何卒以下の質問に答えてくださいませ。m_ _m ある固定されてない数の数字の右から2番目の左すべてを抜き出し、右端も同時にぬきだしたいのですが、なんともならんです。。。 $bango2 = 12345678;←この数字の数は固定されていません。 1 while $bango2 =~ s/(^.\d*$)(.*\d)/$1,$2/g; 結果は:1234567 と 8 が分けられるようにしたいのですが、 こうすると数字すべてが読まれてしまいます。 なんとか、分けられる方法がないでしょうか? 今後は、正規表現を中心に勉強していくつもりですんで、 今回は何卒、お教えを御願いいたします。 m _ _ m

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

  • ベストアンサー
  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.1

こうなんじゃないでしょうか。 $bango2 = 12345678; $bango2 =~ s/(\d*)(\d)/$1,$2/;

sunnyringo
質問者

補足

ドンピシャ!でございました!本当にアホな私を救ってくださいまして、誠にありがとうございました!大変感謝感激でいっぱいです。すごく助かります。私もレベルを上げて、貴方様のように困っている方に答えられるようにしたいと感じました。 再度、お礼を申し上げます。 本当にありがとうございました!m_ _ m

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

その他の回答 (1)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

尻尾とそれ以外を切り分ければいいんですか? #!/usr/bin/perl # -*- coding: utf8 -* use strict; use warnings; while (my $num = <DATA>) { chomp $num; my $last = chop $num; printf "%s : %s\n", $num, $last; } __END__ 1 12 123 1234 12345 123456 1234567 12345678 123456789 1 : 2 : 1 3 : 12 4 : 123 5 : 1234 6 : 12345 7 : 123456 8 : 1234567 9 : 12345678 なんでもかんでも正規表現でやろうとせんほうがいいと思いますよ。

sunnyringo
質問者

補足

ご親切にお教え頂きまして本当にありがとうございます。 ご指摘いただきました教えは心に深くとどめることに致しました。 お忙しい中ご足労頂きまして感謝致します。 m_ _ m

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

関連するQ&A

  • 10進数文字列の変換

    #include <stdio.h> unsigned int chg(char *); main() {      char m[6] unsigned int value; printf("変換する10進数文字列の入力\n"); gets(m); value =chg(m); printf("%d", value); } unsigned int chg(char *p) { unsigned int w; w = 0; while(*p){ w = w * 10 + *p - '0'; p++; } return w; } aを入力すると49が出力されるのですが unsigned int w; w = 0; while(*p){ w = w * 10 + *p - '0'; p++; } の部分の処理なのですが どのように49に変換している のかが今ひとつ分かりません。 どなたかご教授よろしくお願いいたしますm(_ _)m

  • 2回以上繰り返される文字列の削除について

    以下の文字列(置換前)で、-aaa について複数存在しているので、 最初の -aaa を残して残りの -aaa をすべて削除したいと考えています。 1回の正規表現+置換で行いたいのですが、どのようにいすればよいでしょうか? 【置換前】 -bbb -aaa -ccc -aaa -ddd -eee -aaa -fff 【置換後】 -bbb -aaa -ccc -ddd -eee -fff ちなみに、複数回の正規表現+置換を使ってよい場合は、 while (m/( -aaa.*) -aaa/) { s/( -aaa.*) -aaa/$1/; } でできると考えています。(動作確認まではしていないので間違ってるかも)

    • ベストアンサー
    • Perl
  • Excelでハイフンが入った文字列の抽出について

    A列に『12-1』、『1-5-10』、『14-15-6-3』など1桁また2桁の数字がハイフンで区切られた文字列があるとします。 そこからB列には左から2番目の数字、C列には右から2番目の数字、D列には1番右端の数字を関数で抽出したいのですが、出来ないでしょうか。 全部半角で、必ず数字は二つ以上あり、桁数は2桁までです。下記の画像のようにしたいです。 http://uproda.2ch-library.com/801593yFu/lib801593.jpg

  • 特定の文字列を削除

    こんにちは perlで特定の文字列からその後ろをすべて 削除したいのですが、うまくできなくて質問します。 Ex)123.12abc   ⇒123.12 012.123abc   ⇒012.123 123.1234|| ⇒123.1234 上記のようなデータの少数点までの数字の後ろにabc、||、半角、全角スペースなど文字列があります. 少数点までの数字の後ろの文字列すべてを削除したいですが、 特定の文字列からその後ろにある文字列全てを指定する方法(正規表現)はありませんでしょうか? どうかご存知の方、教えてください!! よろしくお願いいたします。

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

    文字列の中間位置にマッチするアサーション表現 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
  • 画面が右から左に

    GeForce8400GS(AOpen F84GS-DLP256X)を増設したのですが、画面の解像度を1024X768にすると、画面中央に幅10cm程の黒い帯。その帯の右に本来画面の左端になる部分が、また帯の左には右端になる部分が表示されます(黒い帯の部分はマウスは移動できません)。ドライバーもプロパティからは正常にインストールできているように表示されています。これ以下の解像度では全く問題ありません。スペックは以下の通りです。 CPU : Pentium4 524 (3.06G) Memory : 1.5GB マザーボード : MSI RC410M 電源 : 250W ディスプレイ : 約15inch (最大解像度1024X768) D-sub15pin接続 グラフィックボード : AOpen F84GS-DLP256X Lowprofile取付け 不足があれば追記します。 どなたか解決法をお教えください。

  • 制御文字を含む文字列を扱うには

    field char(50) binary not null unique primary key,fulltext (field) この設定で作られたフィールドがあり、主にlike検索をされます。 このフィールドには本来10進数の数字の文字列を入力する事を考えていたのですが、(数値としては桁数が大きすぎる事と、その数字列の中に"123"を持つ物を探すなど数量とは関係無い検索がされる事から文字列にしています) MySQLのリファレンスによると、インデックスの対象になる文字列は桁数が短い方がいいようなので、どうせ数値でなく文字列を使っているのならと思い、1バイトで表現出来る全ての文字を使い256進数で表し、桁数を節約しようと考えました。 256進数に直してしまうと10進数の状態で"ある数字列"を持つのかどうか分からなくなるのではないかと思うかもしれませんが、それはこのフィールドに行われるlike検索の特徴により解消されます。 長い前置きでしたが、質問はタイトル通り制御文字を含む文字列を扱う事、言い換えれば0~255の全ての文字コードを文字列データとしてMySQLでインサート・全文インデックス・セレクトする方法です。このフィールドのデータは出力される事は無く、selectのwhere部分に使われ、出力されるのは同レコード内の別のフィールドのデータです。 素直に以下のコードでテストしましたが失敗しました。 while ($i < 50){ $rand = mt_rand(0,255); $str .= chr($rand); $i++; }/*insertする文字列$strを生成*/ $sql = "insert into table(field) values ('$str')" $strの中に制御文字や"や'等の文字が入るとinsertが失敗し、追加出来たレコードについても、コマンドプロンプトからselectして出力してみるとPCが警告音を連発します。 何か方法は無いでしょうか?

    • ベストアンサー
    • MySQL
  • 力学のテストのやり直しをしているのですが、次の問題がどうしてもわかりません。

    力学のテストのやり直しをしているのですが、次の問題がどうしてもわかりません。 教えていただければ幸いです。 水平で滑らかな床の上に質量M、長さlの板を置く。この板の上を質量mの人が左端から右端まで動くとき、板は床に対して左へdだけ動く。最初の板の左端の位置を座標の原点とし、右向きを正とする座標xで考える。板の質量中心は板の中心にあるとする。以下の問いに答えよ。 (1)最初、人が板の左端に静止している。このとき、人と板からなる系の質量中心の位置を求めよ。(m、M、lを用いて表せ。) (2)人が板の右端まで達したとき、人と板からなる系の質量中心の位置を求めよ。(m、M、l、dを用いて表せ) (3)板の床に対する左方向への移動距離dを求めよ。その際の考え方を簡単に述べよ。

  • 選択範囲に下→上、左→右に同時に連番を振りたい

    エクセル初心者です。エクセル2010を使用しています。 エクセルで記号や数字を入力して作業をしています。 作業の方向は、基本的に下から上、右から左です。 作業の途中や、終了時点で入力の範囲の右側と下側に連番を入力するのですが、 その時点で、必要な範囲の右端列、左端列、最下段、上の段に連番を入力したいのです。 シートも範囲も変動します。50段位~になります。 基本になる連番は右端列、下の行になります。 セルの数を数えたりして、オートフィル等で連番を入力していますが、選択したらその範囲に自動的にマクロで連番をふることができたらと思って、質問させていただきました。 画像を添付いたしました。よろしくお願いします。

  • C++ 文字数カウントについて。

    こんにちは。 C++ についてお尋ねします。 下のx.txtをインプットすると、y.txtがアウトプットされるC++プログラムを作りたいです。 while { } を使うことが条件です。しかし、なかなか出来ません。 while { } で文字数カウントの方法を中心に教えてください。 よろしくお願いします。 大文字、小文字共にカウントします。 例: A と a 両方カウントします。 x.txt の内容--- ll chA chI ll chU chE ll chO jyo ll shi shu ll she sho l nyi nyu nyo ---------------- ↓↓ y.txt の内容------------------- 母音の数、行数、文字数。 a の個数: 1 e の個数: 2 i の個数: 3 o の個数: 4 u の個数: 3 line の個数: 5 総文字数(全てのキャラクター): 68 -----------------------------------