- ベストアンサー
[000-100]などの文字列を解析したい
- みんなの回答 (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(); } }
その他の回答 (3)
- 11447
- ベストアンサー率50% (1/2)
もっと簡単な方法があるかもしれませんが, (1)範囲指定の先頭と最後の[]を外す. (2)String.splitを使って-の前後に分ける. (3)Integer.parseIntで001などを数値に変換する という方式でプログラムを書いてみました.結果文字列はArrayListで返します. 以下にプログラムを示します. import java.util.ArrayList; class StringNumber { public static void main(String args[]) { String str="[010-020]"; ArrayList<String> seq=generateString(str); for(int i=0; i<seq.size(); i++) { String s=seq.get(i); System.out.println(s); } } static ArrayList<String> generateString(String str) { String mstr=str.replaceAll("[\\[\\]]",""); String ary[]=mstr.split("-"); int from=Integer.parseInt(ary[0]); int to=Integer.parseInt(ary[1]); ArrayList<String> res=new ArrayList<String>(); for(int i=from; i<=to; i++) res.add(Integer.toString(i)); return res; } }
お礼
回答ありがとう御座います。 提示していただいたソースだと「10」~「20」が表示されると思います。 [010-020]を与えた場合には「010」~「020」を表示して欲しかったです。
- luckymako
- ベストアンサー率55% (29/52)
以下のようなプログラムでいかがでしょうか? import java.text.DecimalFormat; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Parser { 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){ System.out.println(parse(src)); } } private static String parse(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); int fsti = Integer.parseInt(fsts); int lsti = Integer.parseInt(lsts); int digit = fsts.length() < lsts.length() ? fsts.length() : lsts.length(); DecimalFormat format = new DecimalFormat(format(digit)); StringBuffer res = new StringBuffer(format.format(fsti)); for(int i = fsti + 1; i <= lsti; i++) res.append("、").append(format.format(i)); return res.toString(); } return ""; } private static String format(int digit){ StringBuffer res = new StringBuffer(); for(int i = 0; i < digit; i++) res.append("0"); return res.toString(); } }
お礼
回答ありがとう御座います。 4の改訂版を使用させていただきます。
- askaaska
- ベストアンサー率35% (1455/4149)
方法はいくつかあるわね。 ・char配列に分解してif文で仕分ける ・Patternでマッチングする ・MessageFormatでparseする ・substringで仕分ける 楽なのは ・Patternでマッチングする 速度重視なら ・char配列に分解してif文で仕分ける ただし、下手なロジックだと遅くなる。 Patternクラスを使うのがかっこいいわね。 コーディングに自信があるなら charに分解するといいわ。
お礼
いつも回答ありがとう御座います。 自分で思いついたのはsubstringでごり押し位でしたが、他の回答者様から回答頂いたPatternの方法を使用することにしました。 本来ならばaskaaska様に回答頂いた時点で自分で作成できなければならないんでしょう。。。
関連するQ&A
- 【VBA】IDを入力して文字列を取り出す関数
ExcelのVBAにてプログラムを作成しています。 IDを引数に渡して、文字列を取り出すような関数を作成しようと思っていますが、 何か良い作成例をご教示頂けないでしょうか? 例としては、このような形を考えています。 ※リソースファイルなどを使用せず、全てコードにて記述。 GetString("TEST_ID") '引数のIDに対応する文字列を返す(ID、文字列はテーブルなどで定義) お手数ですが、よろしくお願いします。
- ベストアンサー
- Visual Basic
- 文字列を指定桁数で分割して配列に入れたい。
文字列を指定桁数で分割して配列に入れたい。 Splitは指定した文字毎に分割して配列に入れてくれますが、 これを指定した桁数で区切って配列に入れたいのですが、 どうすればいいでしょうか? 環境はVisual Studio 2005でVBを使っています。
- 締切済み
- Visual Basic
- テキストファイル 文字列置き換え
複数のテキストファイルを一括で別の連番のついた文字列に 置きかえることのできるソフトを探しています。 以下の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でなくても他に良い方法があればおしえてください。
- ベストアンサー
- JavaScript
- 文字列
・文字列をキーボードから入力する関数を作成する。 書式:char *StrInp(char *pDefStr, int nLen); 引数:char *pDefStf; 初期文字列 int nLen; 入力可能文字数(1~79) 戻り値:正常ならば、入力した文字列の先頭ポインタ、エラー時はNULL。 処理:pDefStrに与えた文字列を初期値とする文字入力を行う。 nLenで指定した文字数まで入力可能とし、その範囲は1~79 までする。入力時の初期カーソル位置は与えた文字列の最後 になります。初期文字列が必要ない場合はヌル文字を与えます。 初期文字列を与えられた場合は、その文字列も更新可能とする。 ・入力の終了は「リターン」キーとする。 ・「BS」キーを押すと、カーソルの1文字前の文字前の文字を 消去する。 という、問いです。難しくてわかりません。どなたかたすけてください。
- ベストアンサー
- C・C++・C#
- 追加質問: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"という文字列をマッチングしてしまうので、うまくいきません。どの位置に出現するかわからないけど、シェルの引数で指定された文字列が含まれている行だけを出力したい場合、どうしたらよいのでしょう・・・。
- ベストアンサー
- その他(プログラミング・開発)
お礼
回答ありがとう御座います。 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);