用于alpha和空格的java正则表达式包括[] \

Kis*_*ine 3 java regex

这是我的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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Ala*_*ore 8

你的正则表达式中有拼写错误:

"[a-zA-z\\s]*"
Run Code Online (Sandbox Code Playgroud)

[A-z]所有的大写和小写字母相匹配 [,],^,_,反斜线和反引号,它的代码点之间发生撒谎Za.

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

"[a-zA-Z ]*"
Run Code Online (Sandbox Code Playgroud)

锚点(^$)不是必需的,因为您正在使用该matches()方法,该方法自动锚定两端的匹配.他们不会伤害任何东西,他们确实帮助传达你的意图.


Ωme*_*ega 7

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

^[a-zA-Z\\s]*$
Run Code Online (Sandbox Code Playgroud)

where ^是字符串的开头,$表示字符串的结尾.


您还可以扩展此类正则表达式以检查字符串大小.假设你想要允许最小5字符和最大20字符

^[a-zA-Z\\s]{5,20}$
Run Code Online (Sandbox Code Playgroud)

但是,因为空格不仅\\s可以是空格字符,还可以是其他字符,例如换行符,制表符等,您可能希望将此限制为仅使用实际的空格字符

 ^[a-zA-Z ]{5,20}$
Run Code Online (Sandbox Code Playgroud)

另外,您可能希望限制多个空格字符按顺序使用.如果是这样,请使用

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

您可能希望字符串始终以非空格字符开头和结尾.要添加此功能,请使用

^(?=.{5,20}$)(?!.* {2,})[a-zA-Z][a-zA-Z ]*[a-zA-Z]$
Run Code Online (Sandbox Code Playgroud)