• ベストアンサー

matchesを否定文として使う方法(Java)

Java実行時の引数として渡された値を元に、 「もし引数が0~9の値“ではない”場合は」というif文を作成したいのですが、 下記の記述だと、引数の最初の文字しか判定されていないようです。 if (args[0].matches("[^0-9]+") 引数の全ての文字が「0~9の値“ではない”」とするには、 どのように指定すれば宜しいでしょうか?

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

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

> 引数の全ての文字が「0~9の値“ではない”」 → ∀x{¬isdigit(x)}≡¬{∃x・isdigit(x)} ここでisdigit(x)は文字xが数字かどうかを表す述語。 ――ってことで、数字があるかをチェックすればよいのでは。 http://ja.wikipedia.org/wiki/%E3%83%89%E3%83%BB%E3%83%A2%E3%83%AB%E3%82%AC%E3%83%B3%E3%81%AE%E6%B3%95%E5%89%87 > .matches("[^0-9]+") ^と$をくっつけるという手も。

hakase-chan
質問者

お礼

度々です。 実現したいのは、 if(0~9の値“ではない”) です。 0~9の値“ではない”時に、trueとなってくれるとうれしいです。

hakase-chan
質問者

補足

ありがとうございます。 すみません。 > ^と$をくっつけるという手も これが具体的にどういうものなのか分かりませんでした。

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

その他の回答 (4)

回答No.5

日本語難しいね(^^; 具体例書くといいですよ。 引数の全ての文字が「0~9の値“ではない”」とは 0 12 0a a aaa どれが該当して、どれは該当しないの? とりあえず、いくつかパターン作ってみたので、お好みのを選んでください。 [^0-9]:0:false [^0-9]:12:false [^0-9]:0a:false [^0-9]:a:true [^0-9]:aaa:false [^0-9]+:0:false [^0-9]+:12:false [^0-9]+:0a:false [^0-9]+:a:true [^0-9]+:aaa:true .*[^0-9].*:0:false .*[^0-9].*:12:false .*[^0-9].*:0a:true .*[^0-9].*:a:true .*[^0-9].*:aaa:true あと、(引数の全て)の文字が「0~9の値“ではない”」場合はループしないと無理です。

全文を見る
すると、全ての回答が全文表示されます。
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.4

String#matches()では文字列全体と一致させようとするから、[^0-9]+ で問題ないように思えます。 http://www.ideone.com/xlbgJ > 下記の記述だと、引数の最初の文字しか判定されていないようです。 なんかそんなこともなさそうな。自分が前提条件を間違えてるだけかもしれませんが。

全文を見る
すると、全ての回答が全文表示されます。
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.3

ありゃ、matches()の仕様を勘違いしてた。こんなかんじじゃなきゃだめみたい: http://www.ideone.com/U9aw3

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

! 使えばいいじゃん, と #1 は言っている. 完全に同意.

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

関連するQ&A

  • クラスを使用した問題

    問題 Mainクラス 1.実行時に引数を付けて実行する。 2.判定クラスのオブジェクトを生成する。 3.args(実行時の引数)から値を取得する。 4.argsから取得した値を引数として、判定クラスのnameメソッドを実行する。 5.argsから取得した値を引数として、判定クラスのageメソッドを実行する。 6.argsから取得した値を引数として、判定クラスのbirthメソッドを実行する。 判定クラス nameメソッド(引数=String) 1.String型の引数を一つ受け取る 2.受け取った引数の値が「name」だった場合、名前を表示する。 戻り値なし。 ageメソッド(引数=String) 1.String型の引数を一つ受け取る 2.受け取った引数の値が「age」だった場合、名前を表示する。 戻り値なし。 birthdayメソッド(引数=String) 1.String型の引数を一つ受け取る 2.受け取った引数の値が「birthday」だった場合、名前を表示する。 戻り値なし。 実行結果 java NameAgeBirth name 岩田 java NameAgeBirth age 27歳 java NameAgeBirth birthday 5月16日 参考例が欲しいです。良かったら参考例をください。よろしくお願いします。

  • VScode Java 文字化け。

    public static void main(String[] args){ if(args.length<3){ System.out.println("引数が足りません"); }else{ System.out.println(args[0]); //1番目の引数 System.out.println(args[1]); //2番目の引数 System.out.println(args[2]); //3番目の引数 } } } C:\Java>javac ArgsTestB.java C:\Java>java ArgsTestB 蠑墓焚縺瑚カウ繧翫∪縺帙s 実行が文字化けします。 何故でしょうか? ご多忙のところ恐れ入ります。 ご回答お待ち申し上げております。 ご回答 Windowsのコマンド・プロンプトのデフォルト・エンコードはShift_JIS系のCP932(Windows-31J)です、UTF-8を使うと文字化けします、Shift_JIS系のCP932(Windows-31J)でセーブして下さい。 VScodeでやっているのですが、CP932(Windows-31J)がエンコードで 見つかりません。 shiftjisでやると文字化けします。 どうしたら文字化けしないでしょうか・・・? ご多忙のところ恐れ入ります。 ご回答お待ち申し上げております。

    • ベストアンサー
    • Java
  • 教えてください。

    class test { public static void main(String args[]) { int A,B,C,D; String N,n; A = Integer.parseInt(args[0]); if(!(args.length == 0)) { if(args[0].length() <= 2 || args[0].length() >= 10) { System.out.println("入力された文字列のバイト数は" + args[0].getBytes().length + "です"); } else if(args[0].length() >= 5 || args[0].length() <= 7 ) { D = args[0].getBytes().length; D = D - 1; System.out.print("入力された文字列の長さは" + ( D ) + "です"); } else if(args[0].indexOf("N") >= 0 || args[0].indexOf("n") >= 0) { System.out.println("引数には'N' または 'n' が含まれていません"); } else if(args[0].indexOf("N") >= 0 || args[0].indexOf("n") >= 0) { System.out.println("引数には'N' または 'n' が含まれています"); } } } } プログラムの仕様は、 プログラムに引数を1つ指定して実行した時、 入力された文字列の長さが、 2 以下、又は 10 以上である場合、 入力された文字列のバイト数を表示 5 以上、かつ、7以下である場合、 入力された文字列の[長さ-1]の値を表示 その他の場合、 入力された文字列の中に、 半角英数字の 'N' または 'n' が含まれている場合は、 引数には'N' または 'n' が含まれています それ以外の場合は 引数には'N' または 'n' は含まれていませんと表示 このようにさせたいんです。 実行例は、 ・D:\Work>java test z 入力された文字列のバイト数は 1 です ・D:\Work>java test dertftd 入力された文字列の長さは 6 です ・D:\Work>java test asd 引数には'N' または 'n' は含まれていません ・D:\Work>java JavaSample7 nfc 引数には'N' または 'n' が含まれています と、実行させたいんですが、Nやnを入力して実行するとエラーが出てしまうんです・・・ 長くなって申し訳ないんですが、どなたかご教授いただけないでしょうか?

    • ベストアンサー
    • Java
  • Timestamp型への変換について(Java)

    Java実行時の引数(args[i])の値を、 Timestamp型に変換してSQLにセットしたいのですが、 Timestamp型への変換がうまくいかず、 例外として ===== java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff] ===== と表示されます。 ちなみに入力値は、 YYYYMMDDhhmmssの形式で、下記のように入力しています。 ===== 20110810000000 ===== APIなどを読んでvalueOfメソッドなど使ってみたのですが。。。 分かる方教えてください!

    • ベストアンサー
    • Java
  • 【Java】数字の判定、Stringへの型変換

    コマンドライン引数を渡して(桁数は様々)、 渡ってきた値が数字のみの場合は値をそのまま出力、 数字のみでなければ1文字ずつ縦に出力するプログラムを作りたいです。 Exceptionを発生させたり正規表現で判定するのではなく、 isNumericを使いたいのですが、型が違うので使えません。 1文字ずつ出力するのはcharAtかなと思ったのですがこれも型が違う。 型変換するにもどこですればいいのか分からず… どこを変えれば良いのか教えて下さい。 public class Test1 { public static void main(String[] args) { if(StringUtils.isNumeric(args)){ System.out.println(args); }else{ for(int i = 0; i<args.length; i++){ System.out.println(args.charAt()); } } } }

    • ベストアンサー
    • Java
  • javascript中の記述でのJSP文<%%>

    javascriptの記述中に以下のような分岐文を作成しました。 ただこれを実行したところ、arrの値に関係なくソース下記に記述しているbbの値が代入されてしまいました。 条件によってどちらか片方だけを通り、片方だけを代入したいのですが可能でしょうか。 他の方法があればご教示お願いします。 if(arr[0].checked) <%a= "aa"; %> if(arr[1].checked) <%a= "bb"; %>

  • 【Java】複数の引数の数値と文字列の判定

    Javaについてです。 コマンドライン引数を複数渡し、渡ってきた値が数字のみの場合は、数値*数値の文字数を出力し 数字のみでない場合は文字列を逆から1文字ずつ出力する。 数値の判定はtry/catchで行い、catchメソッドには「stringFlg = true;」のみにする。 というプログラムを作りたいのですが、 引数が1つの時は上手くいくのですが、11 2あ あ3 44を渡した場合、 22 あ 2 3 あ 88 と出るはずが、 22 1 1 あ 2 3 あ 4 4 と出てしまいます…。 どうしたら全ての引数を正しく表示出来るのでしょうか?教えて下さい。 現時点のソースコードです。 public class Test { public static void main(String[] args) { boolean stringFlg = false; try { if(StringUtils.isNumeric(args[0])){ for(String arg : args) { int num = Integer.parseInt(arg); System.out.println(num * arg.length()); } } else{ stringFlg = true; } } catch (NumberFormatException e) { stringFlg = true; } if(stringFlg){ for(String val : args) { String[] str = val.split(""); for(int i = str.length-1; i >= 0; i--){ System.out.println(str[i]); } } } } }

    • ベストアンサー
    • Java
  • java:サブクラスメソッドを呼び出したいです。

    java のプログラムで抽象クラスをオーバーライドしたサブクラスのメソッドをスーパークラスで呼び出したいのですが、どうしてもコンパイルが通りません。また通ったとしてもコマンドプロンプト画面で、 c:\File>javac UseSam.java c:\File>java UseSam 5 6 c:\File> となってしまい(この問題で求められている回答)5+6の結果 11 が返ってきません。 c:\File>java UseSam a a c:\File>型が違います c:\File>java UseSam 3 4 5 c:\File>引数の個数が不正です 上記のように打つとエラーメッセージだけは返ってきます。 つたない文章とはなってしまいましたが、ご教授のほどよろしくお願いいたします。 プログラムは下記のとおりとなります。(問題点などの指摘などしていただけたらありがたいです) 抽象クラスAbsSamは抽象メソッドadd含んでいる。 抽象メソッドaddは整数を返すメソッドで、整数型の引数aとbをとる。 abstract class AbsSam {     public abstract int add(int a, int b); } Samでは、抽象メソッドaddを実装し、addは引数a,bの和を返す。 public class Sam extends AbsSam {     public int add(int a,int b) {     return a + b ;     } } mainメソッドを含むUseSam。 プログラム実行時、引数として2つの整数を渡します。 c:\File>java UseSam 5 6 c:\File>11 と計算結果が返ってくる。 (条件) ・引数が2個でない場合、エラーメッセージを返す。 ・引数が数値でない場合、エラーメッセージを返す。 ・正しい引数が与えられた場合、addメソッドを実行し、addメソッドの続行結果を表示して終了とする。 public class UseSample { public static void main( String[] args ) { try { //引数が2個でない場合 if(args.length != 2){ System.out.println("エラーメッセージ:引数の個数が不正です"); //引数が2個の場合 } else if (args.length == 2) { int a = Integer.parseInt( args[0] ); int b = Integer.parseInt( args[1] ); AbsSam sum = new Sam(); sum.a = a; sum.b = b; System.out.println ("計算結果" + sum.add()); } else { System.out.println("エラー"); } //例外処理 } catch(NumberFormatException e) { System.out.println("エラーメッセージ:引数の型が不正です" ); } catch(Exception e) { System.out.println("エラー"); } } } 抽象クラスとサブクラスは問題ないのですが、UseSamがうまく動作しません。 ご教授のほどよろしく願いいたします。

    • ベストアンサー
    • Java
  • for文を使った累乗の計算方法について

    質問させてください。 for文を使った累乗の計算プログラムを作っています。 数値はコマンドライン引数から取得し、0番目の数字を i番目の数字分累乗するというものです。 ソースを途中まで作成したのですが、0乗した場合のプログラムが よく分かりません。どなたか教えていただけないでしょうか? public class Mondai { public static void main(String[] args) { //変数の初期化 int k = 0; if ( 2 <= args.length && args.length < 3) { //コマンドライン引数の数だけ配列を用意する int[] num = new int[args.length]; //0,1番目のコマンドライン引数を整数に変換してnumに代入する num[0] = Integer.parseInt(args[0]); k = num[0]; k *= k; num[1] = Integer.parseInt(args[1]); //num[1]の掛け算をnum[1]回繰り返す for (int i = 0; i < num[1] -2; i++) { k *= num[0]; } System.out.println("\"" + num[0] +"の" + num[1] + "乗は"+ k + "\""); if(num[1] == 0) { System.out.println("\"" + num[0] +"の" + num[1] + "乗は1\""); } //args.length <= 1の条件の時 } else if(args.length <= 1) { System.out.println("引数が足りないため累乗の計算ができません。"); //指定された条件以外の時 } else { System.out.println("引数が多すぎるため累乗の計算ができません。"); } } }

    • ベストアンサー
    • Java
  • if等判定文での定数、変数の記述順序

    perlスクリプトなどで、判定文を記述する際の考え方について、 重箱の隅的な質問になりますが、よろしくお願いします。 (1)if等判定文での定数、変数の記述順序 例えば、ある変数が0であることを判定するのに、結果は同じなのですが、 [] if($a == 0) [] if(0 == $a) のどちらで書く方が良い(理にかなっている)のでしょうか? (文字列でも同じでしょうか) [] if("$a" eq "") [] if("" eq "$a") (2)私はよく上限、下限の判定を行う際に、 [] 0 < x < 10 ということを表現する際に、 数学的に見映え(並び順)が同じになるよう、 [] if((0 < $x) && ($x < 10)){ と書くのですが、(1)のことと照らし合わせると、 [] if(($x > 0) && ($x < 10)){ と書いたり、 [] if((0 < $x) && (10 > $x)){ と書くほうが良いでしょうか。 (3)以上の(1)(2)のことは、標準的なC言語でも同じでしょうか? (4)Perl独特の書き方ですが、1行で済む実行文の場合、 [] 実行文 if(条件文); と書く方が、 [] if(条件文) 実行文; と書くよりも変換効率(?)か何かが良いと聞いたのですが、 どういう理由でどちらが良いとかありますか? この辺の違いはコンパイラが吸収してくれるので、どちらでも良いとか、 何か参考になる文献などもありましたら、ご教示よろしくお願いします。

    • ベストアンサー
    • Perl