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]匹配所有大写和小写字母 [, ], ^,_ , 反斜杠和反引号,它们的代码点恰好位于Z和之间a

另外,我同意@Ωmega,您可能应该使用实际的空格字符而不是\s

"[a-zA-Z ]*"

锚 (^$) 不是必需的,因为您使用的是该matches()方法,该方法会自动在两端锚定匹配。不过,它们不会伤害任何东西,而且它们确实有助于传达您的意图。

于 2012-10-08T04:46:04.413 回答
7

你应该使用正则表达式模式

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

where^是字符串的开头,$代表字符串的结尾。


您还可以扩展此类正则表达式以检查字符串大小。假设您是否要允许最小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 回答