我有这段代码,它应该删除任何非字符值并用空格替换它(它会删除非字符值)
public void firstNameOnlyText() {
txtFirstName.textProperty().addListener(new ChangeListener<String>() {
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
if (!newValue.matches("\\D*")) {
txtFirstName.setText(newValue.replaceAll("[^\\D]", ""));
}
}
});
}
代码完全可以删除数字,但我不知道使用什么正则表达式,所以它也取代了标点符号(例如`,!,],[等等]
有人可以帮助我吗?
答案 0 :(得分:3)
首先,不要使用侦听器来实现此功能。这里的问题是,如果在文本字段的text属性上有另一个侦听器,那么该侦听器将在恢复到有效状态之前看到无效状态(使用非字符输入)。文本字段上任何类型的过滤器的目的应该是确保只能看到有效状态。您应该使用TextFormatter
代替。
正则表达式规则在Pattern
documentation中描述。如果您想允许任何大写或小写字母字符,可以使用"[a-zA-Z]"
;如果您想明确匹配Character.isLowerCase()
或Character.isUpperCase()
的规则,可以使用
"[\\p{javaLowerCase}\\p{javaUpperCase}]"
。
以下是一个例子:
Pattern pattern = Pattern.compile("[a-zA-Z]*");
UnaryOperator<TextFormatter.Change> filter = c -> {
if (pattern.matcher(c.getControlNewText()).matches()) {
return c ;
} else {
return null ;
}
};
TextFormatter<String> formatter = new TextFormatter<>(filter);
txtFirstName.setTextFormatter(formatter);
答案 1 :(得分:0)
您可以使用否定的正则表达式集^
来仅保留A到Z(不区分大小写)。如果筛选的字符串不同,请设置文本框的值。
final String filtered = newValue.replaceAll("[^a-zA-Z]", "");
if (!newValue.equals(filtered)) {
// set
}