Discussion:
[問題] JTextField的判定輸入格式設定?
(时间太久无法回复)
阿本
2007-01-08 17:05:15 UTC
Permalink
最近寫了個小程式卻出現了問題,我需要能判定JTextField欄位輸入的值是IP位置,也就是
只能輸入255以下的數字,其他一律禁止,我是將IP位置分成4個JTextField來輸入,但我目
前使用的方法只想到幾種,都有問題如下

第一個
xxx.getText().matches("[0-2][0-9][0-9]{1,3}")
但這樣255是合法的,299卻是非法IP,無法抓出

另一個
xxx.getText() < 256
雖然一定可限制在255以內,但若輸入非數字一樣抓不到

另一個
xxx.getText() < 256 && xxx.getText().matches("[^a-zA-Z]")
語法好像有點錯,限制在255以內及非大小寫a-z,語法較長且有4個欄位要確認,輸入符號或
中間有空格一樣抓不到

目前還想不到好方法,理論上用matches()會是最好的選擇,一律禁止限定格式以外的,只能
輸入0-2或0-9的數字,但255以上的數值不知該怎麼判別,大家有想到其他好方法嗎?

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.216.196.104
阿本
2007-01-08 17:55:58 UTC
Permalink
※ 引述《PsMonkey (痞子軍團團長)》之銘言:
: ※ 引述《laruku2000 (阿本)》之銘言:
: : 最近寫了個小程式卻出現了問題,我需要能判定JTextField欄位輸入的值是IP位置,也就是
: : 只能輸入255以下的數字,其他一律禁止,我是將IP位置分成4個JTextField來輸入,但我目
: : 前使用的方法只想到幾種,都有問題如下
: : 第一個
: : xxx.getText().matches("[0-2][0-9][0-9]{1,3}")
: : 但這樣255是合法的,299卻是非法IP,無法抓出
: : 另一個
: : xxx.getText() < 256
: : 雖然一定可限制在255以內,但若輸入非數字一樣抓不到
: @___@ 這是....
: JTextField.getText() 不是回傳 String...
: String 怎麼跟 int 比較大小
: 把第一個跟第二個(用 Integer.parseInt())一起用就好啦
: 然後 catch 個 Exception
: ====
: 也是有點莫名其妙的問題 @__@??

抱歉,寫的有點簡略,JTextField.getText()我有用Integer.parseInt()來比,matches回傳
的是boolean值,不能用parseInt(),把兩個一起用,256以上不行一定抓的出來,但其他非
數字一樣抓不到,會有exception,我希望能限定在只能輸入255以下的數字,其餘皆不得使
用,不知還有什麼方法可以限制?

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.216.177.114
好累想睡覺
2007-01-08 20:32:40 UTC
Permalink
※ 引述《laruku2000 (阿本)》之銘言:
: 最近寫了個小程式卻出現了問題,我需要能判定JTextField欄位輸入的值是IP位置,也就是
: 只能輸入255以下的數字,其他一律禁止,我是將IP位置分成4個JTextField來輸入,但我目
: 前使用的方法只想到幾種,都有問題如下
: 第一個
: xxx.getText().matches("[0-2][0-9][0-9]{1,3}")
: 但這樣255是合法的,299卻是非法IP,無法抓出
恕刪
: 目前還想不到好方法,理論上用matches()會是最好的選擇,一律禁止限定格式以外的,只能
: 輸入0-2或0-9的數字,但255以上的數值不知該怎麼判別,大家有想到其他好方法嗎?
我想到的一個暴力法 不過也不算暴力啦

因為你列出的判斷式問題出在 2開頭的地方只到 255 所以我就把 0 和 1的分一組

2 開頭的部分分成另外一組 但是 2 開頭的部分只有 255 的限制是 250~255

其他像是 200可以到 209 所以我就把十位數為 0~4 的和 5 分成兩組

示意圖如下 :

[0-1][0-9][0-9] (0或1開頭的)

IP表示
↘ ↗ [2][0-4][0-9]
[2][0-5][0-5] (會lose掉209這種的)
↘ [2][5][0-5]


因此我的正規表示法寫成

String IP = "抓到的字串" ;

IP.matches("([0-1][0-9][0-9])|([2]([0-4][0-9]|[5][0-5]))")) ;

我目前測過 000~299 的字串都 OK 結果如下 會不會有其他例外就不知道了 XD

000 true
.
.
250 true
.
.
255 true
256 false
.
.
299 false

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 163.25.118.131
學無止境,啥時才摔到底?
2007-01-09 01:14:38 UTC
Permalink
※ 引述《laruku2000 (阿本)》之銘言:
: : 把第一個跟第二個(用 Integer.parseInt())一起用就好啦
: : 然後 catch 個 Exception
: : ====
: : 也是有點莫名其妙的問題 @__@??
: 抱歉,寫的有點簡略,JTextField.getText()我有用Integer.parseInt()來比,matches回傳
: 的是boolean值,不能用parseInt(),把兩個一起用,256以上不行一定抓的出來,但其他非
: 數字一樣抓不到,會有exception,我希望能限定在只能輸入255以下的數字,其餘皆不得使
: 用,不知還有什麼方法可以限制?

為什麼要排斥exception呢?
這不就代表抓到了使用者的輸入有誤嗎?
catch之後處理掉就又是一條好漢了啊~ (菸) <( = o=).-~~

--
No Dying Skills, ● - Dame! New tech...
but Lazy Users. .\)
http://www.wretch.cc/blog/hougzou ___________ ﹒ ︵ √\ ___________________

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.129.166.172
骨頭
2007-01-09 09:21:00 UTC
Permalink
※ 引述《laruku2000 (阿本)》之銘言:
: 最近寫了個小程式卻出現了問題,我需要能判定JTextField欄位輸入的值是IP位置,也就是
: 只能輸入255以下的數字,其他一律禁止,我是將IP位置分成4個JTextField來輸入,但我目
: 前使用的方法只想到幾種,都有問題如下
: 第一個
: xxx.getText().matches("[0-2][0-9][0-9]{1,3}")
: 但這樣255是合法的,299卻是非法IP,無法抓出
: 另一個
: xxx.getText() < 256
: 雖然一定可限制在255以內,但若輸入非數字一樣抓不到
: 另一個
: xxx.getText() < 256 && xxx.getText().matches("[^a-zA-Z]")
: 語法好像有點錯,限制在255以內及非大小寫a-z,語法較長且有4個欄位要確認,輸入符號或
: 中間有空格一樣抓不到
: 目前還想不到好方法,理論上用matches()會是最好的選擇,一律禁止限定格式以外的,只能
: 輸入0-2或0-9的數字,但255以上的數值不知該怎麼判別,大家有想到其他好方法嗎?

我是覺得你『一定可以』一起用,但是你『不想』或『不會』一起用,
就和你不會限制 0~256 卻只能用 0~299的判別一樣。

人就是要變通嘛!!!不會的時候除了學,就是硬幹啊~囧
學程式應該就知道沒有永遠"聰明"的選擇...


好啦,其實上面只是說笑的,
不過下次至少去Google一下regexp的用法,

我敢打賭除非你又省略了甚麼事情沒講(這樣就要翻桌啦),

不然上面match的 rule你一定沒測過,
你上面的rule是從 00 0 到 29 999,和你的255扯不上關係...

就IPv4的IP來講範圍值應該是0-255,不然就是我才疏學淺不曉得這個規則...
我的蠢解法大概也只比你本來的錯誤rule好一點,不過可以確實work。XD

────────────────────────────────

/* regexp中 () 內可視為一單位 , | 則代表 or */
String reg="([01]{0,1}[0-9]{1,2})|(2[0-4][0-9])|(25[0-5])";
//0-199 200-249 250-255

/*要養成測試結果的好習慣*/
for(int i=0;i<299;i++){
String t=""+i;
System.out.println(t+" "+t.matches(reg));
}
────────────────────────────────

but 如果是我的話,我會寧願選擇

try{
int k= Integer.parseInt(t);
if(k<0 || k>255 )
throw new NumerberFormatException("out of bound");
}catch(NumberFormatException e){
/* Show Warning Message */
}
該歸數學解決的就讓它歸數學解決啊......

────────────────────────────────

如果只是考慮到不想要Exception的問題,更簡單的變通作法是:

int k=-1;
if(t.matches("[0-9]+")){
k=Integer.parseInt(t);
if(k<0||k>255) k=-1;
}
if(k==-1){
/* Show Warning Message */
}

────────────────────────────────

連愚笨如我都能想到這些問題的解法了 ,
這應該不會是很大的問題啊...囧


--
鎖螺絲有螺絲起子不用,要用電動起子就算了,
連說明書也不看,結果用電動起子鑽不動還說螺絲起子不能用....大囧
--
 String temp="relax"; | Life just like programing
 while(buringlife) String.forgot(temp); | to be right or wrong
 while(sleeping) brain.setMemoryOut(); | need not to say
 stack.push(life.running); | the complier will
 stack.push(scouting.buck()); | answer your life
 stack.push(bowling.practice()); | Bone everything

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.134.27.68
※ 編輯: TonyQ 來自: 220.134.27.68 (01/09 17:20)
※ 編輯: TonyQ 來自: 220.134.27.68 (01/09 17:22)
阿本
2007-01-09 17:18:56 UTC
Permalink
: : 雖然一定可限制在255以內,但若輸入非數字一樣抓不到
: 我是覺得你『一定可以』一起用,但是你『不想』或『不會』一起用,
: 就和你不會限制 0~256 卻只能用 0~299的判別一樣。
: 人就是要變通嘛!!!不會的時候除了學,就是硬幹啊~囧
: 學程式應該就知道沒有永遠"聰明"的選擇...
: 好啦,其實上面只是說笑的,
: 不過下次至少去Google一下regexp的用法,
: 我敢打賭除非你又省略了甚麼事情沒講(這樣就要翻桌啦),
: 不然上面match的 rule你一定沒測過,
: 你上面的rule是從 00 0 到 29 999,和你的255扯不上關係...
: 就IPv4的IP來講範圍值應該是0-255,不然就是我才疏學淺不曉得這個規則...
: 我的蠢解法大概也只比你本來的錯誤rule好一點,不過可以確實work。

感謝大家的指導,我終於解決問題了,感覺會了以後只是個很簡單的小問題,但不會
時就一直想不出來,語法也錯一堆,試半天沒結果=.=||,我問前都試過也查過google了,
我查的下面那個網址其實就介紹了很多regular的使用,只是小弟程式能力頗糟還在訓練,
看的不是很懂...所以試不出來.....謝謝大家的幫忙喔~~

http://www.javaworld.com.tw/jute/post/view?bid=20&id=130126&sty=1&tpg=1&age=0

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.216.181.168

Loading...