2012-10-06 70 views
3

這是我的JTextField的正則表達式,不能超過x個字符,並且不包含字母或空格以外的任何其他字符。 出於某種原因,它允許[]和\字符。這讓我瘋狂。我的正則表達式錯誤嗎?對於alpha和空格的java正則表達式包括[]

package com.jayavon.game.helper; 

import java.awt.Toolkit; 

import javax.swing.text.AttributeSet; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.PlainDocument; 

public class CharacterNameCreationDocument extends PlainDocument { 
    private static final long serialVersionUID = 1L; 
    private int limit; 

    public CharacterNameCreationDocument(int limit) { 
     super(); 
     this.limit = limit; 
    } 

    public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException { 
     if (str == null || (getLength() + str.length()) > limit || !str.matches("[a-zA-z\\s]*")){ 
      Toolkit.getDefaultToolkit().beep(); 
      return; 
     } else { 
      super.insertString(offset, str, attr); 
     } 
    } 
} 
+0

因此,例如,您只需要長度爲3的字符串,它應該只是'hel','y y',而不是'c [ss','kkkk'? – Walter

+0

是的,這是正確的,目前我稱它爲20,它允許我輸入[]或\ – KisnardOnline

回答

8

你在你的正則表達式一個錯字:

"[a-zA-z\\s]*" 

[A-z]所有的大寫和小寫字母[]^_,反斜線和反引號,它的代碼點發生Z之間作出匹配和a

而且,我@Ωmega同意,你或許應該使用的實際空間字符,而不是\s

"[a-zA-Z ]*" 

錨(^$)沒有必要的,因爲你使用的matches()方法,它自動錨定兩端的匹配。儘管如此,他們並沒有傷害任何東西,他們的確有助於傳達你的意圖。

+0

完美謝謝,這就是我的問題。 ..愚蠢的錯字... – KisnardOnline

4

您應該使用正則表達式

^[a-zA-Z\\s]*$ 

其中^是字符串的開始和$代表字符串的結尾。


您也可以擴展這樣的正則表達式來檢查字符串大小。讓我們,如果你想允許的最小5字符,最多20字符

^[a-zA-Z\\s]{5,20}$ 

說,然而,由於空白\\s可以不只是空格鍵字符,還包括其他本地字符,如新行,製表等等,你可能想使用

^[a-zA-Z ]{5,20}$ 

Additionaly這個限制只是真實空格鍵的字符,你可能希望限制按順序使用多個空格字符。如果是這樣,使用

^(?!.* {2,})[a-zA-Z ]{5,20}$` 

你可能想串總是啓動和與非空格字符結束。要添加這樣的功能,以

^(?=.{5,20}$)(?!.* {2,})[a-zA-Z][a-zA-Z ]*[a-zA-Z]$ 
+0

它允許我輸入[]或\我不想要 – KisnardOnline

+0

@JayAvon你確定你的'(getLength( )+ str.length())> limit'邏輯是否正確? Ωmega的圖案不允許輸入這些字符。 –

1

重新格式化您的正則表達式到這個去:

^[A-Za-z\\s]{0,3}$ 

只是改變3到你所需要的長度。

+0

它允許我輸入[]或\,我不想要也不是0,3不是問題的一部分,我正在使用該文件,這很好用 – KisnardOnline