3

これは、JTextFieldがx文字より長くなく、文字またはスペース以外のものを含まないことに対する私の正規表現です。 何らかの理由で、[]文字と\文字を許可しています。 これは私を夢中にさせています。私の正規表現は間違っていますか?

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);
        }
    }
}
4

3 に答える 3

8

正規表現にタイプミスがあります。

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

[A-z]すべての大文字と小文字に加えて、、、、、バックスラッシュとバックティックに一致します。これら [のコードポイントはたまたまとの間にあります。]^_Za

また、@Ωmegaには、おそらく次の代わりに実際のスペース文字を使用する必要があることに同意します\s

"[a-zA-Z ]*"

アンカー(^および)は、両端で一致を自動的にアンカーするメソッド$を使用しているため、必要ありません。matches()しかし、彼らは何も傷つけません、そして彼らはあなたの意図を伝えるのを助けます。

于 2012-10-08T04:46:04.413 に答える
7

正規表現パターンを使用する必要があります

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

ここで、^は文字列の開始であり、文字列$の終了を表します。


このような正規表現を拡張して、文字列サイズを確認することもできます。5最小文字数と最大20文字数を許可したい場合は、

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

ただし、空白\\sはスペースバー文字だけでなく、改行やタブなどの他の文字でもかまいません。これを使用して、実際のスペースバー文字だけに制限することをお勧めします。

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

さらに、連続して使用される複数のスペース文字を制限したい場合があります。その場合は、

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

文字列は常にスペース以外の文字で開始および終了する必要がある場合があります。このような機能を追加するには、

^(?=.{5,20}$)(?!.* {2,})[a-zA-Z][a-zA-Z ]*[a-zA-Z]$
于 2012-10-06T15:50:13.220 に答える
1

正規表現を次のように再フォーマットします。

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

3を希望の長さに変更するだけです。

于 2012-10-06T15:50:23.957 に答える