Javaのjava.util.regex.Matcherクラスと
java.util.regex.Patternクラスを使用して正規表現を使った
数値の入力チェックを行いたいと思っています。

行いたいチェックは下記の通りです。

【内容】
整数5桁以内で入力
小数部は1桁、ただし小数部は任意入力

例:
1234 => OK
12345 => OK
123456 => NG

12345. => NG
12345.1 => OK
12345.12 => NG

色々考えてみましたが
小数部が任意入力の事もあり、
うまく実現できずに困っています。

このような場合どのような正規表現を組めば良いでしょうか?
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

[0000.1]


をOKとするか否かによりますが、
わたしはNGとするほうが自然で好きです。

なので正規表現は少し複雑になって以下のようになります。
^(([1-9]\\d{0,4})|0)(\\.\\d)?$
    • good
    • 3
この回答へのお礼

回答ありがとうございました。
ここまでできるなんて
正規表現は奥が深いですね。
きちんと勉強するようにします。

お礼日時:2006/02/15 23:50

^\d{1,5}(\.\d)?$


でどうでしょう
    • good
    • 0
この回答へのお礼

お答えいただきありがとうございました。
参考になりました。

お礼日時:2006/02/15 23:49

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qphpの正規表現でカタカナ+スペース+カタカナ

phpの正規表現で全角カタカナ+全角スペース+全角カタカナ
というパターンを取り出したいのですが、
上手く取り出すことが出来ずに困っております。

どなたかご教授ください。
よろしくお願いいたします。

Aベストアンサー

<?PHP
$str="あい うえアイ ウエあい ウエ オカ キク ケコ";
$pattern="/[ァ-ンー]+ +[ァ-ンー]+/u";
preg_match_all($pattern,$str,$matches);
print_r($matches);

みたいなかんじ(UTF8限定)

Qjava.util.Date型をjava.sql.Date型に変換

java.util.Date型をjava.sql.Date型に変換ってできるのでしょうか?

Aベストアンサー

util.Date には、
1970 年 1 月 1 日グリニッジ標準時 00:00:00.000からの時間を
取得/設定する関数がありますよね?

sql.Dateは、util.Dateを継承しているので
同じ関数がありますよ。

キャストという手もありますけどね!
明示的には上の方がわかりやすいかも。

#1の方の言ってる通りなのでとりあえずヒントです。
いろいろ調べる力もプログラマには必要ですよ~!

Q正規表現 .+? について

正規表現(egrepコマンド)の .+? とはどのようなパターンを意味するのでしょうか。
例1のケース(.+? の部分)が何故マッチするのかがわかりません。
また、例1, 2のケースは共にマッチしますが、
.+? と .*? の違いは何になるのでしょうか。

例1.
echo "tmp/foo.txt" | egrep "tmp.+?/.+?foo[^/]*$"

例2.
echo "tmp/foo.txt" | egrep "tmp.*?/.*?foo[^/]*$"

Aベストアンサー

「?」はPOSIXを含むいわゆる正規表現では0か1回マッチするという意味です
({0,1}とほぼ同意)
最短マッチに使うのはPerl互換ですね

「tmp.+?/」は「tmpに続く『何か1文字以上の文字』が『0回または1回』出現する」
なので「tmp/」にマッチすると考えられます

Qjava.util.Comparatorのcompareメソッドの振る舞いについて

はじめまして。
質問をさせていただきます。
以下のソースで、
===============================================================
import java.util.Comparator;
import java.util.TreeSet;
import java.util.Iterator;

final class Demo
{
public static void main(String[] args)
{
TreeSet<Integer> set =
new TreeSet<Integer>(new Comparator<Integer>()
{
public int compare(Integer i,Integer j)
{
int result = i%2 - j%2;
if(result==0)
{
result = i-j;
}
return result;
}
});

for(int i=0;i<10;i++)
{
set.add(10-i);
}

Iterator<Integer> it = set.iterator();
while(it.hasNext())
{
System.out.println((Integer)it.next());
}

}
}
================================================================
実行結果
================================================================
2
4
6
8
10
1
3
5
7
9
================================================================
偶数が最初に昇順で出力され、奇数が後から昇順で出力されている
のですが、なぜこのような実行結果になるのかがわかりません。
どうかご教授お願いします。

はじめまして。
質問をさせていただきます。
以下のソースで、
===============================================================
import java.util.Comparator;
import java.util.TreeSet;
import java.util.Iterator;

final class Demo
{
public static void main(String[] args)
{
TreeSet<Integer> set =
new TreeSet<Integer>(new Comparator<Integer>()
{
public int compare(Integer i,Integer j)
{
int result = i%2 - j%2;
...続きを読む

Aベストアンサー

質問のタイトルを見ると、Comparator#compareメソッドの一般的な使用法のように受け取れますが、
内容を見るとサンプルの処理内容が質問のようにもとれ、
どちらかわかないので両方回答しておきます。

次回からは、タイトルは適切につけて下さい。
無意味な回答になることもありますので。


並び替えを行うには、各項目間の大小関係を取得する必要があります。
Comparator#compareメソッドはそれを定義するものです。

compare(a,b)であるとき、

a>bであるなら正の整数
a<bであるなら負の整数
a=bであるなら0

を返します。

ソートなどのプログラムは、正の整数が返されたときにはaとbの位置を入れ替えます。

3,2,1というデータの場合、

3,2を比較->正の整数->入れ替え->2,3,1
3,1を比較->正の整数->入れ替え->2,1,3
2,1を比較->正の整数->入れ替え->1,2,3
ソート終了

となります。
この例はバブルソートというものでjavaのソートの実装とは異なりますが、
compareの使い方に関しては同じです。


今回のサンプルを解説すると、

int result = i%2 - j%2;

は2で割った余りを引き算しています。
この処理で変数resultは、
i、jが偶数同士又は奇数同士のときには0
iが偶数、jが奇数なら-1
iが奇数、jが偶数なら 1
となります。

次に、
if(result==0)
{
result = i-j;
}
ですが、変数resultが0の場合というのは、
i、jが偶数同士又は奇数同士のときで、
そのときに、iとjの大小比較をしています。
i>jなら正の整数
i<jなら負の整数
i=jなら0


全部をまとめると、

iが偶数、jが奇数なら負の整数
iが奇数、jが偶数なら正の整数
i、jが偶数同士又は奇数同士のとき、
 i>jなら正の整数
 i<jなら負の整数
 i=jなら0

となります。


つまり、

1.まず偶数か奇数かで並び替え
2.同じなら数の大小で並び替え

ということになります。

質問のタイトルを見ると、Comparator#compareメソッドの一般的な使用法のように受け取れますが、
内容を見るとサンプルの処理内容が質問のようにもとれ、
どちらかわかないので両方回答しておきます。

次回からは、タイトルは適切につけて下さい。
無意味な回答になることもありますので。


並び替えを行うには、各項目間の大小関係を取得する必要があります。
Comparator#compareメソッドはそれを定義するものです。

compare(a,b)であるとき、

a>bであるなら正の整数
a<bであるなら負の整数
a...続きを読む

Q正規表現 .+? と .++ と .+ の違いについて

正規表現でタグを除こうと思っています。
最初は任意の一文字の連続として
<.+>でうまくいくと思ったのですが、これだと
すべて取り除かれてしまいます。
何らかの一文字(の連続)が連続するとして、
<.++>としましたがこれだと何もマッチしません。
いろいろ調べて、
<.+?>だとうまくいきます。
なぜ最後のだけうまくいくのかよくわかりません。
最初の<.+>でうまくいけばわかりやすいのですが。
なにかアドバイスがありましたらお願いします。

Aベストアンサー

どの正規表現を使用していますか。(perl,sed,等)
それとも、Cのプログラムから正規表現ライブラリを使用しているのでしょうか。(C&C++のカテゴリへの投稿なので)
正規表現にも方言がありますので、まず、どの正規表現
をしようしているかを提示して下さい。(できればOSも。)
また、やりたいことは
<...任意の文字列...> を
両端の<>をとって
...任意の文字列... にしたいということでしょうか。

Q

数十の<a>タグがあるHTMLファイルの中で、
<div id="blank">で囲まれた<a>タグ群のみをすべてtarget="_blank"にしたいと考えています。
該当する<a>タグすべてにtarget="_blank"を書くと、HTMLファイルの容量が大きくなるので、CSSのIDとJavaScriptを組み合わせて、実現できないものでしょうか。

Aベストアンサー

<base target="_blank">
<div id="blank">
 <!-- -->
</div>
<base target="_self">

Q「半角数字」と「+」を許可する正規表現の書き方

「半角数字」と「+」(半角プラス)を許可する正規表現を書きたいです。


検索していて
このような電話番号のチェックはよく見掛けます。

preg_match('/^\d{2,5}-?\d1,5}-?\d{3,5}$/', $tel)



今回は、下記のデータを許可したいです。

1+
1254+
21+1000+
5154+45+987+201+

桁の指定は不要で、+の後ろには数値が無い場合もあります。
「+」は数字の後に必ず付いてきます。

宜しくお願い致します。

Aベストアンサー

こんな感じで

<?php
$sample=array(
"1+","1254+","21+1000+","5154+45+987+201+" //OK
,"111" //数字だけ
,"+" //プラスだけだけ
,"+222+333+" //先頭がプラス
,"444+555" //最後がプラスじゃない
,"66-7+888+" //数字プラス以外を含む
);
$pattern="/^(\d+\+)+$/";
foreach($sample as $val){
print $val."=&gt;";
print preg_match($pattern,$val)?"OK":"NG";
print "<br>\n";
}
?>

Q

▼次のようにページ内のdivタグのidの名前によって、formタグ内の要素をdisableにすることはJava scriptによって可能でしょうか?

<div id="AA">のとき、別の場所にある<form id="BB">内のselect要素などすべての要素をdisableにする。

また同時に、id="BB"に指定したスタイルシートの記述を書き換えることは可能でしょうか?

何かよい方法をご存知でしたら教えてください。よろしくお願いいたします。

Aベストアンサー

>なぜか時々エラーが出ます。
ウチでちょっと試した程度ではエラーが発生しませんでした。
できましたら、発生したときのメッセージや場所また、ブラウザの種類なども教えてください。

以下は、予防的な意味での注意点についてちょっと書きます。
>return false;

は、必要ないです。
書かない方がいいと思います。
==nullの場合の処理が必要ないなら
!=nullにすればよいです。
もしくは
return false;でなくて
;
のように空文でもよいです。
あと、idに使っている名前と同じ名前を変数名として使わない方が良いです。
つまり、
id="soldout"の時に
var soldout;という風にはしない方が良いです。
同じでなければ、cartFormでもなんでもかまいません。
あと、scriptは、
<!--
(スクリプトの中身)
//-->
のように
<!--
//-->
で囲むようにします。

getElementById
は、ブラウザやのブラウザのバージョンによっては使えないことがあります。
その場合は、使えるかどうかを調べる必要があります。

<script type="text/javascript">
<!--
function stockStatus (num){
var f=document.getElementById("soldout");

if(f!=null){
for (var i =0; i<=f.length -1 ;i++){
f.elements[i].disabled=num;
}
}
}
//-->
</script>

>なぜか時々エラーが出ます。
ウチでちょっと試した程度ではエラーが発生しませんでした。
できましたら、発生したときのメッセージや場所また、ブラウザの種類なども教えてください。

以下は、予防的な意味での注意点についてちょっと書きます。
>return false;

は、必要ないです。
書かない方がいいと思います。
==nullの場合の処理が必要ないなら
!=nullにすればよいです。
もしくは
return false;でなくて
;
のように空文でもよいです。
あと、idに使っている名前と同じ名前を変数名として...続きを読む

Qアルファベット+数字に部分マッチする正規表現

任意文字数のアルファベット+任意桁数の数値で構成された
単語にのみ部分マッチする正規表現を教えてください。
条件は、前に数字が無いこと、または、後ろにアルファベットが無いことです。


例えば、

  23*ade3456,ad-r4+4er3456=pol34k#gtu34&-de23knm723a3
この場合、

 ade3456
 r4
 gtu34

に、マッチして欲しいのです。

 4er3456
これは、手前に数字があるのでマッチしてはいけません。
 pol34k
こちらは後ろにアルファベットが続いているのでマッチしてはいけません。
 de23knm723a3
これはどこで切っても条件を満たしません。

以上、よろしくお願いいたします。

Aベストアンサー

こんにちは。No.2のものです

コツとしては
「ほしいものを厳密に表現しましょう」
です。

ggable様の考える、「任意文字数のアルファベット+任意桁数の数値で構成された単語」は
 [a-zA-Z]+[0-9]+
ではなく、
 (?<![a-zA-Z])[a-zA-Z]+[0-9]+(?![0-9])
であることが、サンプルから読み取れました。

これに2つの条件を加えまして・・・
 (?<![0-9])(?<![a-zA-Z])([a-zA-Z]+[0-9]+)(?![0-9])(?![a-zA-Z])

このままでもいいのですが、まとめてすっきり、
 (?<![0-9a-zA-Z])([a-zA-Z]+[0-9]+)(?![0-9a-zA-Z])

という感じです

Qjava.util.CalendarでのgetTime結果

お世話になります。
カレンダークラスを使用してDBへ格納するためのシリアル値を取得しようとしています。
やりたいことは任意の年月日(時分秒は無し)をPostgreSqlのDATEフィールドに日付として格納させ、レコード取得した結果の該当DATEフィールドと先ほどの任意の年月日を比較させたいのです。予想される結果は「一致」なのですがこれが不一致となってしまいます。

例えばjava.util.CalenderクラスのgetTime()を使用して取得されるシリアル値は1174611700734ですが、DBへ格納された後にレコードから取得されるデータは1174575600000となっていて比較しても不一致となってしまいます。
java.util.CalenderのgetTime()結果は実行するたびに値が異なるようで、下3桁が上記例のように"734"だったり"015"だったりします。
getTime()の結果で返されるシリアル値の下3桁を"000"とする方法はあるのでしょうか?

java.util.Calendar xcal = java.util.Calendar.getInstance();
xcal.set(2007, 3 - 1, 23, 0, 0, 0);
java.util.Date xday = xcal.getTime();

#xdayには"1174575600015"と格納されています。
#xdayをそのままPostgreSqlへデータ投入すると、日付のみ格納され次回取得時には"1174575600000"となります。

お世話になります。
カレンダークラスを使用してDBへ格納するためのシリアル値を取得しようとしています。
やりたいことは任意の年月日(時分秒は無し)をPostgreSqlのDATEフィールドに日付として格納させ、レコード取得した結果の該当DATEフィールドと先ほどの任意の年月日を比較させたいのです。予想される結果は「一致」なのですがこれが不一致となってしまいます。

例えばjava.util.CalenderクラスのgetTime()を使用して取得されるシリアル値は1174611700734ですが、DBへ格納された後にレコードから取得...続きを読む

Aベストアンサー

xcal.set(Calendar.MILLISECOND, 0);
でミリ秒を0にあわせてみては?
DATEがミリ秒に対応していないんじゃないんでしょうか?
詳しくは分かりませんが。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報