我正在为 JavaFX 创建一个带有登录名和用户名的识别窗口,我正在使用正则表达式来确保密码至少包含一个特殊字符和一位数字。
这是我正在使用的正则表达式
newValue.matches("*\\d+.*\\W+.*")
它适用于在线测试站点,但是当我在文本字段中输入任何内容时出现错误。这是我正在使用的代码段:
public void progressBarHandler() {
login.textProperty().addListener((observable, oldValue, newValue) -> {
if(newValue.matches("*\\d+.*\\W+.*")) {
passState.textProperty().set("Bad");
}
else passState.textProperty().set("Ok");
});
}
每当我运行代码并在文本字段登录中写一些东西时,我都会收到此错误:
Exception in thread "JavaFX Application Thread" java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0
最佳答案
*
量词以贪婪的方式“重复”(量化)它修改零次或多次的模式(允许正则表达式引擎“获取”(=消耗)尽可能多的字符与给定的模式)。如果 *
或任何其他量词出现在模式的开头,则没有量词可以修改的模式,并且会出现错误。
也就是说,用作正则表达式的 *abc*
glob 模式会产生同样的问题,{1,}abc.*
, + abc.*
或 {5}+abc.*
等
您可以通过在此处的 *
前面简单地添加一个点来修复模式,因为您希望匹配包含模式 digits...non-word chars.. 的字符串。 .
:
newValue.matches(".*\\d+.*\\W+.*")
// ^
然而,一个更好、更高效的模式是
newValue.matches("\\D*\\d\\w*\\W.*")
匹配
- 字符串开头(
匹配
需要完整的字符串匹配) \D*
- 零个或多个非数字字符\d
- 一个数字\w*
- 0 个或多个单词字符\W
- 非单词字符.*
- 尽可能多的除换行符以外的任何零个或多个字符。- 字符串结尾(
匹配
需要完整的字符串匹配)。
关于java - 无效的正则表达式 : Dangling meta character "*",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64348884/