• ベストアンサー

[000-100]などの文字列を解析したい

luckymakoの回答

  • ベストアンサー
  • luckymako
  • ベストアンサー率55% (29/52)
回答No.4

No2です。Iteratorを使った実装もあります。 こちらの方がメモリの消費を抑えられます。 import java.text.DecimalFormat; import java.util.Iterator; import java.util.regex.Matcher; import java.util.regex.Pattern; public class IteratableParser {  public static void main(String[] args) {   String[] srcs = new String[]{    "FILE[000-100]",    "FILE[0-1000]_",    "FILE[00-10]__",    "FILE[10-100]_",    "FILE[100-200]"   };   for(String src : srcs){    for(String num : new Numbers(src)){     System.out.print(num + '、');    }    System.out.println();   }  } } class Numbers implements Iterator<String>, Iterable<String> {  private final int fsti;  private final int lsti;  private final DecimalFormat formater;  private int pointer;  public Numbers(String src){   Pattern p = Pattern.compile("\\[([0-9]++)[-]([0-9]++)\\]");   Matcher m = p.matcher(src);   if(m.find()){    String fsts = m.group(1);    String lsts = m.group(2);    fsti = pointer = Integer.parseInt(fsts);    lsti = Integer.parseInt(lsts);    int digit = fsts.length() < lsts.length() ? fsts.length() : lsts.length();    StringBuffer format = new StringBuffer();    for(int i = 0; i < digit; i++)     format.append("0");    formater = new DecimalFormat(format.toString());   }   else{    fsti = pointer = 0;    lsti = -1;    formater = new DecimalFormat();   }  }  public Iterator<String> iterator() {   return this;  }  public boolean hasNext() {   return pointer <= lsti;  }  public String next() {   return formater.format(pointer++);  }  public void remove() {   throw new UnsupportedOperationException();  } }

tetuya120
質問者

お礼

回答ありがとう御座います。 2の回答にもありましたが下記のようなやり方がある事を知って凄く勉強になりました。 また、Iteratorの実装はよく聞きますが実際に使用したことがなかったのでこちらも目から鱗が落ちました。 これからも勉強していきます。ありがとうございました。 Pattern p = Pattern.compile("\\[([0-9]++)[-]([0-9]++)\\]"); Matcher m = p.matcher(src); String fsts = m.group(1); String lsts = m.group(2);

関連するQ&A

  • 【VBA】IDを入力して文字列を取り出す関数

    ExcelのVBAにてプログラムを作成しています。 IDを引数に渡して、文字列を取り出すような関数を作成しようと思っていますが、 何か良い作成例をご教示頂けないでしょうか? 例としては、このような形を考えています。 ※リソースファイルなどを使用せず、全てコードにて記述。 GetString("TEST_ID") '引数のIDに対応する文字列を返す(ID、文字列はテーブルなどで定義) お手数ですが、よろしくお願いします。

  • 文字列を指定桁数で分割して配列に入れたい。

    文字列を指定桁数で分割して配列に入れたい。 Splitは指定した文字毎に分割して配列に入れてくれますが、 これを指定した桁数で区切って配列に入れたいのですが、 どうすればいいでしょうか? 環境はVisual Studio 2005でVBを使っています。

  • テキストファイル 文字列置き換え

    複数のテキストファイルを一括で別の連番のついた文字列に 置きかえることのできるソフトを探しています。 以下の3つの条件を満たすソフトはありますでしょうか? ・複数のテキストファイルを一括で置き換え可能 ・「何行目の文字列を置き換える」という指定が可能 ・置き換えた文字列に連番をつけることが可能 ご存知でしたら、ご教示ください。 よろしくお願いします

  • 秀丸、正規表現で、パターンにマッチした文字列を取り

    秀丸で、下記のような文字列を取り出したいです。 ■例 menu-hoge-01234"> ・半角スペースmenu-hoge-桁数不明の数字"> ・桁数不明の数字部分だけ変わります ■初め 半角スペースmenu-hoge- ■終わり ">の前まで 例で言ったら、 menu-hoge-01234 を取り出したいです

  • エクセル 特定の文字列から範囲を指定

    エクセル 名前定義の範囲について質問です。 始まり・終わりの行・列を示す特定の文字列を設定し、 それを元に自動で範囲を変化させるようなことはできませんでしょうか。 例えば、 B1:列ここから D1:列ここまで A3:行ここから A6:行ここまで と書かれていた場合、 名前定義の範囲が自動で「B3:D6」となるような方法を探しています。 なお、 ・列を指定する文字列は必ず1行目に ・行を指定する文字列は必ずA列目に あるという想定です。 極力マクロを使用しない方法で、有効なものがございましたら ご指導のほどよろしくお願いします。

  • 文字列の検索

    ある文字列の中から、たとえば@1234のように @の後に数字が4桁連続している文字列を探す構文を matchを使って記述したいのですが、 matchの引数をどのように指定すればいいのかわかりません。 [0-9]やd\と{4}をいろいろ組み合わせてはみたんですが、 どうしてもうまくいきません。 matchでなくても他に良い方法があればおしえてください。

  • 文字列

    ・文字列をキーボードから入力する関数を作成する。 書式:char *StrInp(char *pDefStr, int nLen); 引数:char *pDefStf; 初期文字列 int nLen; 入力可能文字数(1~79) 戻り値:正常ならば、入力した文字列の先頭ポインタ、エラー時はNULL。 処理:pDefStrに与えた文字列を初期値とする文字入力を行う。    nLenで指定した文字数まで入力可能とし、その範囲は1~79    までする。入力時の初期カーソル位置は与えた文字列の最後    になります。初期文字列が必要ない場合はヌル文字を与えます。    初期文字列を与えられた場合は、その文字列も更新可能とする。   ・入力の終了は「リターン」キーとする。   ・「BS」キーを押すと、カーソルの1文字前の文字前の文字を    消去する。 という、問いです。難しくてわかりません。どなたかたすけてください。        

  • 追加質問:EXCEL セル内の特定の特定の文字のみを抽出したい (関数だけで)

    http://oshiete1.goo.ne.jp/qa4393007.htmlで『特定の数字のみ』の抽出方法を質問させていただいておりますが、作業を進めるうちに特定の文字列をも抽出する必要がでてきました! 数値(1) 文字列(1) 数値(2) 文字列(2) 【例】 11213234 AIUEO21213 ABC 42321243 KAKIKUKEKO32480 CBAAA 59343124 SA85727 BBAC 数値(1)の桁数は同一 文字列(1)の文字数は変動 数値(2)の桁数は同一(だが、文字列(1)が変動のため、スタート位置はことなってくる) 文字列(2)の文字数も変動 ひとつ補足ですが文字列(1)と数値(2)の間にはスペースがありません。 以上の条件で文字列(1)のみを抽出する方法などはあるのでしょうか? よろしくお願いします!

  • マイコンのID解析

    ルネサスのマイコンのプログラムを書き換えたいのですが、 接続時にIDコード入力を求められます。 しかし、IDコードが不明の為、総当たり方式で解析できないか?と検討しています。 解析ソフトや解析方法をご教示頂きたく、ご回答宜しくお願いします。 <ID入力に関して> ・入力文字 入力可能文字:0~9,a~f(16進数の文字です) 入力桁数:14桁 入力方法:14桁連続です ※例:00000000000000や0123456789abcdなど 入力画面や手順は画像に記載しましたので、 ご参照お願いします。

  • awkで可変文字列をマッチング

    シェルなどでawkを使う際に、シェルの引数として渡された文字列をawkに渡し、それを条件にマッチングをかけたいのですが、どうしたら良いのでしょうか?(まあ、素直にgrepを使えばいいのですが・・・) 例えば、 cat foo.txt | awk '{if ($2 == ptn) print}' ptn=$<シェルの引数> とかやれば、2番目のフィールドに完全に一致する行が抽出できるのですが、 cat foo.txt | awk '/ptn/ {print}' ptn=$<シェルの引数> とかやっても、"ptn"という文字列をマッチングしてしまうので、うまくいきません。どの位置に出現するかわからないけど、シェルの引数で指定された文字列が含まれている行だけを出力したい場合、どうしたらよいのでしょう・・・。