Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

正規表現の式について?

APIでmatchesについて調べていましたが、式の構成について、よくわからないのですが半角数字0〜9以外のものをエラーにする場合は、どのような式になりますか?
ヒントをください。

51

回答

80065

閲覧

51件の回答

評価

0

正規表現の書き方が解らないのか、Javaでのコードの組み立て方が解らないのか、というところがあるかと思いますけど、質問は一応前者として。

>半角数字0〜9
或いは"以外"は、正規表現の基本としてまず出てきている筈ですのでググッてみましょう。

"正規表現 数字"くらいでググッてみればいいかと思いますけどね。

それより後者の方が実際にはややこしかったりするのかも知れませんけど。
更に"java"を加え、絞ってググッてみるとどうでしょう。

評価

0

書き忘れたけど、一応・・。

ググッてみればと言っているのは、折角なら半角数字0〜9以外についても知った方が絶対お徳ということで。

数字0〜9だけで終わってしまう正規表現なら、わざわざ正規表現を使うこともないんでは?というところで。

評価

0

何処か最近同じような質問が出てたと思ってたけど・・

http://219.94.131.140/bbs/answer.jsp?q_id=20060901113907344
と同一?

評価

0

式の例題が記載されているホームページはわかりますか?計算機のプログラムを作っていて0〜9まではOKで
それ以外はエラーにしたいのですが、それが書かれている例題みたいなものが見当たらないのです。

評価

0

String value = "9";
boolean isFlg = value.matches("[0-9]");

計算機だから、マイナスも扱わないといけないのでは???

評価

0

はい、マイナスの計算も入ります。
例えば1+aをaは数字ではないのでエラー処理したいのですが、何かいいヒントはありませんか?
String value = "9";
boolean isFlg = value.matches("[0-9]");
を試してみたのですが、1+aで計算してみてもエラー処理がうまくいかず、NumberFormatExceptionが出ます。

評価

0

これは、なかなか難問?
    String value1 = "10+20";      //こんな文字列が入力される???//
    String value2 = "10+2A";      //こんな文字列が入力される???//
    String value3 = "(10+2)*2";   //こんなのがくるとやだな・・・//

評価

0

 String value1 = "10+20"は入力されますが、他のは無いです。
     

評価

0

演算子でトークナイズして、1つ1つを数値チェックしましょう。
いずれにせよ回答が出る前にエラーになるので、ユーザにとってエラーの出るタイミングは一緒です。

評価

0

一つ一つ数値をチェックするとは、どういう意味ですか?正規表現は使わないのですか?

評価

0

正規表現を使ってもできなくはないです。
あんまり正規表現は得意でないので、間違ってるかもですが、

\d+\+\d+

こんなのとマッチさせるとか。
先に+で切り分けて、前後を\d+でマッチさせるほうが、簡単かなと思ったのです(とくに、複数項を想定する場合)。

\d+(\+\d+)+

複数項だと、こんなかな?

\dのところにマイナスをどう入れるかは、ご自分でどうぞ。

評価

0

以下のようにやってみたのですが、演算子の前の文字は出来たのですが、後ろの文字がトークナイズで分割できません。どうしたら演算子の後ろの文字を分割出来ますか?教えてください。
int plus = searchPlus(line);
StringTokenizer tokenizer = new StringTokenizer(line, "+");
String mark = tokenizer.nextToken().trim();
if (plus != -1 && mark.equals("0") || plus != -1 && mark.equals("1")) {
String plusFront = getPlusFrontCharacter(line,plus);
double plus1 = Double.parseDouble(plusFront);
String plusBack = getPlusBackCharacter(line,plus);
double plus2 = Double.parseDouble(plusBack);
System.out.println(plus1 + plus2);
}

評価

0

searchPlusだのgetPlusFrontCharacterだのといったメソッドが分からないのと、markの意味が分からないのとで、これだけではなんとも言えません。

評価

0

searchPlusは演算子+を探してる
getPlusFrontCharacterは演算子+の前の文字を抜き出している。
markはトークナイズで分割した値です。

評価

0

メソッドの意味はメソッドの名前から分かることです。問題なのはその中身です。
markについては、なんのために使っているかということです。

分割自体はlineとplusがあればできることなので、ではmarkは何のために使っているのかと。

評価

0

markはトークナイザーはstring型なので、int型であるplusは使えないのかと思って、markにしました。

評価

0

話がかみ合っていないので少しフォローを

轟さんはStringTokenizerの使い方を知らないのでトークナイズで分割出来ていません、searchPlusやgetPlusFrontCharacterなど無くても分割できます。

mioさんは暗にそのことを指摘しているのであってmarkがString型とかうんぬんを言っているのではありません。

StringTokenizerは次のように使います。
while (tokenizer.hasMoreTokens()) {
  mark = tokenizer.nextToken();
}
これで"100+200+300"とかだと
"100" "200" "300"が次々に取り出せます。

評価

0

ありがとうございます。トークナイザーの意味はわかりました。あとは、半角数字のみをOKにしてあとは全てエラー処理したいのですが、どのようにしたらうまく処理できるのでしょうか?教えてください。

評価

0

フォローthxです>tamaさん

轟さん:
+を考えないで良くなったわけですから、最初に戻りましょう。

評価

0

1つずつ数値をチェックするということですか?
それは、どのようにしてチェックしていけばよいのでしょうか?

評価

0

少しは読み返したり、考えたりして、実際に試していますか?
チェック自体はすでに上がっていますよ?

評価

0

どれですか?1つずつ数値をチェックすることと正規表現を使うことしか書かれていませんが他にもあるんですか?

評価

0

お願いします。サンプルを教えてください。

評価

0

サンプルというのは、組み合わせることができなければ意味がありません。
2006-09-04 15:17のどどろきさんのサンプルと、2006-09-05 14:52のtamaさんのサンプルを組み合わせてください。

評価

0

サンプルを組み合わせてやってみたのですが、
どうしてもうまくいきません。
int plus = searchPlus(line);
String value = "9";
boolean isFlg = value.matches("[0-9]");

StringTokenizer tokenizer = new StringTokenizer(line, "+");
if (plus != -1 && isFlg) {
while (tokenizer.hasMoreTokens()) {
String character = tokenizer.nextToken();System.out.println("character =" + character);
}
どうしてでしょうか?教えてください。

評価

0

そのようにしか組み合わせられないのは、そもそもサンプルの意味が全く分かっていないからです。
それぞれのサンプルが何をしているのか、ちゃんと考えてみてください。
答えを書くことは簡単ですが、今までのやりとりからすると、それでは何の勉強にもならないでしょう。

評価

0

characterとisFlgを比較して処理をするのはわかるのですが、それをどのように組み合わせたらいいかがわからないのです。ヒントをください。お願いします。

評価

0

なんというか・・・

>characterとisFlgを比較して処理をするのはわかる

と言ってる時点で間違ってるような・・・
そもそも、どどろきさんのサンプルをそのまま書いているだけでisFlgになんの意味もありません。

matchesメソッドを使う位置を考えましょう

評価

0

String value = "9";
boolean isFlg = value.matches("[0-9]");
これ自体意味がないということなのでしょうか?
String value = "9";
はなぜ"9"なのかがよくわかりません。
matchesメソッドを使う位置というのは、if文の中で使えばよいのでしょうか?教えてください。

評価

0

えーと
boolean isFlg = value.matches("[0-9]");
が何をやっているか理解してませんよね?
質問する前にmatchesのドキュメントをよく読んでください。

あと話がややこしくなりそうなので、今のうちに指摘しておきます。
使い方が分かって正しく使っても"[0-9]"のままではうまくいきません。
"[0-9]+"にして下さい、なぜなのかは勉強してください。

評価

0

valueと[0-9]がマッチしているかどうかを判定しているんですよね?

評価

0

混乱してますね…。
マッチしているかどうか判定しているのだから、じゃあvalueには何が入っていればいいですか?
論理的に筋道を立てて考えることができないと、プログラムは作れません。

評価

0

その通りです、ならばどこでどのように使うのか、答えは見えています。

評価

0

とりあえず、「2つのサンプルを組み合わせる」と言うのは、「自分の書いた部分は捨てて」ということです。

>int plus = searchPlus(line);

これは、書いてもらった2つのサンプルには、ないものですよね?

評価

0

なんかすごく話が続いていますが、
題名には"正規表現の式について?"とかなっていますけど、正規表現とかが出てくるのは早すぎるような気も。

正規表現とかトークナイザとか出てきますが、まずこれらのことは捨てて、そういったものを使わずにやろうとしていることをロジックにするべきかと。

コードをただ並べてもプログラム(ロジック)にはなりません。
正しいかどうかも判断できないままただJavaScriptとかコピってきて"できた"とか、条件だけ縦に並べて"できた"とか言っても、それはコードを並べただけのことでロジックにはなっていないでしょう。

正規表現とかトークナイザとかは、ちまちま書いたコードをもっと簡潔に済まそうと用意されたもので、基本的なロジックの考えが固められないまま使おうとしても、何にもならないと思います。

それがまたこんなにただ長く話が続いていることになってしまっているのではないかと。

仮にこのまま進めて、希望するものができたとしても、その先何かやろうとしてもまた同じようなことになるだけでないかと。
"いや、やってるうちに理解できると思う"とか思ったりするかもですが、それは甘い。

評価

0

轟さんのやりたいことを整理しましょう。

「lineという文字列が【数値+数値+・・・】の形式であるかを調べたい」

というのが、やりたいことで合ってますか?

これまでに出てきたお話で、
1.+を区切り文字とし分割する
2.matchを使って数値かどうかをチェックする
の二つの方法がわかったかと思います。(2に関してはよく理解できてないような気もしますが)

つまり
1.lineを分割する
2.分割した配列の中を一つずつ数値かどうかを調べる
3.数値以外のものが見つかったらエラーにする

というロジックが生まれます。
あとは、この文章をJAVAソースで書くだけです。(サンプルはあくまで例に過ぎないことを忘れないでください)

まずは、自分のやりたいことを頭で(または紙などに)整理し、それからコーディングをするようにしましょう。

がんばってください。

評価

0

>じゃあvalueには何が入っていればいいですか?
半角数字が入っていればいいんですよね?

評価

0

>>じゃあvalueには何が入っていればいいですか?
>半角数字が入っていればいいんですよね?

まずは、matchesメソッドを理解してください。
轟さんはmatchesメソッドをどのように解釈しているのですか?

評価

0

>matchesメソッドをどのように解釈しているのですか?
文字が指定された正規表現と一致するかどうかを判定する。というふうに理解しています。

評価

0

>半角数字が入っていればいいんですよね?
そうじゃなくて…。
とおりすがりさんの言葉を借りれば、

>2.分割した配列の中を一つずつ数値かどうかを調べる

matchesメソッドを使っている。
これは(正規表現の内容込みで)引用の後半「数値かどうかを調べる」という意味ですが、良いでしょうか。
まず一点目。理解できますか?

では、引用の前半部分「分割した配列の中の一つ」。
これがvalueになります。
つまり、valueに入っていればいいのは「分割した配列の中の一つ」です。
二点目。理解できますか?

プログラムは魔法でもなんでもないです。
こうした、いくつかの手順を論理的に並べて作られるだけのものです。
「考える」ことを放棄したら、何をやってもプログラムを書けるようにはなりません。

評価

0

かなり長くなってしまいましたが、半角数字以外は全部エラー処理することができました。これをもう少し簡潔にすることはできますか?
StringTokenizer tokenizer = new StringTokenizer(line, "+");
String character = tokenizer.nextToken();
String value = character;
boolean isFlg = value.matches("[0-9]+");
if (plus != -1 && isFlg == true) {
while (tokenizer.hasMoreTokens()) {
character = tokenizer.nextToken();
value = character;
isFlg = value.matches("[0-9]+");
}
if (isFlg == false) {
System.out.println("計算式が正しくありません");
} else if (isFlg == true) {
String plusFront = getPlusFrontCharacter(line,plus);
double plus1 = Double.parseDouble(plusFront);
String plusBack = getPlusBackCharacter(line,plus);
double plus2 = Double.parseDouble(plusBack);
System.out.println(plus1 + plus2);
}
} else if (plus == -1 || isFlg == false) {
System.out.println("計算式が正しくありません");
}

評価

0

うーん…。
「できますか?」と言われれば、「できます」となります。それも、ものすごく。

自分で作ったものがどうやって動いているのか、ある変数にある時点で何が入っているのか、ちゃんと理解していますか?
「良く分からないけど、とりあえずできた」に、なっていませんか?

評価

0

こんにちわ。
横から失礼します。

この話題も長くなりそうですね。
回答の受け答えを見ていると「サーブレットに送信できません」と同じ系統(同一?)に見えますね。
先日まで「Java電卓作成のプログラム」について解答していたので混ぜてください(笑)←よくタイトルをみるとすごいタイトルだ。
このまま行くときっと「計算ができません?」なんてタイトルで質問あがるでしょうし。
だって、「計算機」で「文字列指定で式を入力」なんでしょう?
()はないとおっしゃっていますが、*や/はあるのではないかと。
StringTokenizerでの分割だけだと……四則混合算は大変になるとおもうんです。

たぶん、この方も宿題なのでしょうけれど。
もしかすると「Java電卓作成のプログラム」と同一?

それは置いておくとして。
とおりすがりさんやmioさんのおっしゃるとおり、やりたいことが整理できていないことが最大の問題点ですね。
私の言う「やりたいこと」はとおりすがりさんやmioさんの様に部分でのやりたいこと、ではなく。
全体を通しての「やりたいこと」つまり『アルゴリズム』です。
今の学校や入門書などは言語別に特化されており、このアルゴリズムが軽視・無視されているなと思います。
そもそもプログラム5大要素って言えますか?

というわけで下記を実行し、掲示しましょう。

・作ろうと思っている「計算機」の動作を動作する順に大まかで良いので箇条書きに書き出しましょう。
例)5人の平均体重を求める場合。
 ・1人目の体重データを受け取る。
 ・1人目の体重データを結果に足す。
 ・2人目の体重データを受け取る。
 ・2人目の体重データを結果に足す。
  :
 ・結果を5で割り、最終結果に足す。
 ・最終結果を出力する。

だめな例)5人の平均体重を求める場合。
 ・5人の体重を全部足して5で割る。

・書き出した箇条書きを印刷し、その脇に仮データを書いていきましょう。
例)5人の平均体重を求める場合。
 ・1人目の体重データを受け取る。 50
 ・1人目の体重データを結果と足す。 0+50
 ・加算結果を結果に保持する。 結果50
 ・2人目の体重データを受け取る。60
 ・2人目の体重データを結果と足す。 50+60
 ・加算結果を結果に保持する。 結果110
  :
 ・結果を5で割る。結果(300)/5
 ・最終結果に足す。 0+60
 ・最終結果を出力する。 →60


ばかばかしいと思いますか?
もしそう思ったのならばプログラムを組むことはやめたほうがいいでしょう。
コンピュータは基本的に「お馬鹿」なので、
懇切丁寧に教えてやら無いと何も出来ないのです。
そこをはしょると「バグ」が生まれるのです。

目的の処理を完成することができるように応援しています。

評価

0

>ちゃんと理解していますか?
プログラムはどのように動いているか、それは理解しています。

評価

0

轟さんの話を総合すると、以下のように推測されます。

質問から matches の使い方を教えてくれとのこと。

今回やろうとしていることは、計算機(!?)を作りたい。
入力される文字列は
String value = "123+456+789";    //の形式だけ。。。

/*
String value = "(10+2)*2";
やら
String value = "090+1111+1111";
なんかは、想定の範囲外です。 (なんともはや。。。)
*/

入力された文字列を、 + で、分割し、
分割された文字列に対して matches を用いて、不正な文字が含まれていないかを判定しよう。
ということになりました。
そこで、
 matches を使う方法や、StringTokenizerの例を多くの方々がご伝授くださいました。
(皆様に感謝なさい)


1:入力文字列を+をキーに分割する。これは StringTokenizer を使って、実現しようということになりました。

そこで、Javaのドキュメントに書いてあるサンプルです。
    
    //
    StringTokenizer st = new StringTokenizer("this is a test");
    while (st.hasMoreTokens()) {
        System.out.println(st.nextToken());
    }

上記サンプルを、試して見ましたか???
ちなみに、
StringTokenizer st = new StringTokenizer("this is a test");

StringTokenizer st = new StringTokenizer("this is a test"," ");
または
StringTokenizer st = new StringTokenizer("this is a test"," ",false);
と同じ意味です。

    仮に、
    String value = "車1+車2+車3";
    String next = null;
    StringTokenizer st = new StringTokenizer(value,"+");        //
    while (st.hasMoreTokens()) {
        next = st.nextToken();
        System.out.println(next);
    }

    上記2つの例を実行すれば、StringTokenizer の使い方は、理解できるはずです。
    StringTokenizer st = new StringTokenizer("this is a test"," ",false);
    のfalseをtrueに変えてみたり、いろいろ考えながら手を動かしてくださいね。



次に、matchesを使って、数値だけの文字列かを調べるということになりました。
    
    String value = "123";
    boolean isFlg = value.matches("[0-9]+");        //結果はどうなりますか?
    
    String value = "1A3";
    boolean isFlg = value.matches("[0-9]+");        //結果はどうなりますか?

    そもそも、制御文のことが分かってないのかしら?なんて思えたりしますので、そこから勉強しなおさないと。。。
    
    //よく、こんなサンプルがあると思うんだけど。。。
    for(int i = 0; i < 5; i++){
        if(i%2 == 0){
            System.out.println("");
        }
        else{
            System.out.println("");
        }
    }

    

評価

0

文字列 "090" は、int値として 90になるですね。
失礼。。。

評価

0

議論を楽しく読ませていただきました(>_<)
質問内容は、
APIでmatchesについて調べていましたが、式の構成について、よくわからないのですが半角数字0〜9以外のものをエラーにする場合は、どのような式になりますか?
ヒントをください。

なので、これについては、答えが出たので、打ち切り。
>これをもう少し簡潔にすることはできますか?
なんて、論外ですよ。

評価

0

確かにこれ以上この話題を掲示板で説明するのは困難な気がしてきましたので、回答者の皆様には悪いですが、簡易的なソースを載せます。
あくまで簡易的なものですので、轟さん自身がもっと効率よく拡張してもらえたらうれしいなぁ。

String line = "10+20+30";

//  文字列を分割する
StringTokenizer tokenizer = new StringTokenizer(line, "+");

int result = 0;
//  分割文字列の数だけループする
while (tokenizer.hasMoreTokens()) {
  //  文字を取得する
  String value = tokenizer.nextToken();
  //  取得した文字が数値かどうかを調査する
  if (value.matches("\\d+")) {
    //  数値であれば、int型に変換して足し算
    result += Integer.parseInt(value);
  } else {
    //  数値でないなら、エラーを表示して終了
    System.out.println("計算式が正しくありません");
    return;
  }
}
//  計算結果を表示する
System.out.println("計算結果:" + result);

評価

0

皆様、ありがとうございました。
大変勉強になりました。

評価

0

>半角数字0〜9以外のものをエラーにする場合は、どのような式になりますか?

確かにレスされたものは、"半角数字0〜9"であるかを判定する式(表現)になっているようでもありますけど、
上記質問だけに絞れるなら

その結果が偽であるものは、"半角数字0〜9"ではない="半角数字0〜9"以外、
或いはその式(表現)を否定に変えれば"半角数字0〜9以外"を示すことになるのでは?

その前に最初にレスした通り、"正規表現"の説明をちゃんと見れば、"半角数字0〜9"である例も"半角数字0〜9以外"の場合の例も、例としてそのまま書かれている解説も多く見られるのではないかと思いますけど・・

見たの?

評価

0

>プログラムはどのように動いているか、それは理解しています。

パッと見だけでも、なんか正しく動作しないように思えるのだけど・・。
それはまたいずれ調べることになったりするのよね?

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。