这是我的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);
}
}
}
您的正则表达式中有拼写错误:
"[a-zA-z\s]*"
[A-z]
匹配所有大写和小写字母加上[
、]
、^
、_
、反斜杠和反引号,其代码点恰好位于Z
和a
之间。
另外,我同意@Ωmega您可能应该使用实际的空格字符而不是s
:
"[a-zA-Z ]*"
锚点(^
和$
)不是必需的,因为您使用的是matches()
方法,该方法会自动将匹配项锚定在两端。 不过,它们不会伤害任何东西,而且它们确实有助于传达您的意图。
你应该使用正则表达式模式
^[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]$
正则表达式重新格式化为:
^[A-Za-z\s]{0,3}$
只需将 3 更改为您想要的长度。