在Java正则表达式中排除带正斜杠的单词
我试图通过Java中的regexp过滤器只允许某些单词,即:在Java正则表达式中排除带正斜杠的单词,java,regex,Java,Regex,我试图通过Java中的regexp过滤器只允许某些单词,即: Pattern p = Pattern.compile("^[a-zA-Z0-9\\s\\.-_]{1," + s.length() + "}$"); 但我发现它允许通过140km/h,因为正斜杠是不处理的。理想情况下,这个词不应该被允许 有人能建议对我的当前版本进行修复吗 我刚接触regexp,还没有完全了解它 regexp位于utils类方法中,如下所示: public static boolean checkStringAlp
Pattern p = Pattern.compile("^[a-zA-Z0-9\\s\\.-_]{1," + s.length() + "}$");
但我发现它允许通过140km/h,因为正斜杠是不处理的。理想情况下,这个词不应该被允许
有人能建议对我的当前版本进行修复吗
我刚接触regexp,还没有完全了解它
regexp位于utils类方法中,如下所示:
public static boolean checkStringAlphaNumericChars(String s) {
s = s.trim();
if ((s == null) || (s.equals(""))) {
return false;
}
Pattern p = Pattern.compile("^[a-zA-Z0-9\\s\\.-_]{1," + s.length() + "}$");
// Pattern p = Pattern.compile("^[a-zA-Z0-9_\\s]{1," + s.length() + "}");
Matcher m = p.matcher(s);
if (m.matches()) {
return true;
}
else {
return false;
}
}
我想允许字符串带有下划线、空格、句点和负号。并确保接受字母数字为123.45或-500.00的字符串,但不接受5000.00的字符串。这是因为连字符在字符集中排在倒数第二位,因此定义了从
.
到'.
的范围,其中包括/'
试试这个:
Pattern p = Pattern.compile("^[a-zA-Z0-9\\s\\._-]$");
另外,NullUserException是正确的,因为不需要{1,“+s.length()+”}
。表达式以“^”
开头,以“$”
结尾,这将确保整个字符串被使用
最后,您可以使用
\w
代替[a-zA-Z_0-9]
,将表达式简化为“^[\\w\\s\\.-]$”
是因为连字符在字符集中排在倒数第二位,因此定义了从'.
到'
的范围,其中包括'/'
试试这个:
Pattern p = Pattern.compile("^[a-zA-Z0-9\\s\\._-]$");
另外,NullUserException是正确的,因为不需要{1,“+s.length()+”}
。表达式以“^”
开头,以“$”
结尾,这将确保整个字符串被使用
最后,您可以使用\w
代替[a-zA-Z_0-9]
,将表达式简化为“^[\\w\\s\\.-]$”
,您只需使用
public static boolean checkStringAlphaNumericChars(String s) {
return (s != null) && s.matches("[\\w\\s.-]+");
}
- 短路空检查确保当您尝试对其执行
时,.matches()
不为s
null
- 使用
查找字母数字加下划线。tchrist还将第一个指出这比\w
[A-Za-z0-9.]
- 最后的
确保您至少有一个字符(即:字符串不是空的)+
- 无需使用
和^
,因为$
尝试将模式与整个字符串匹配.matches()
- 在字符类中也不需要转义点(
)
public static boolean checkStringAlphaNumericChars(String s) {
return (s != null) && s.matches("[\\w\\s.-]+");
}
- 短路空检查确保当您尝试对其执行
时,.matches()
不为s
null
- 使用
查找字母数字加下划线。tchrist还将第一个指出这比\w
[A-Za-z0-9.]
- 最后的
确保您至少有一个字符(即:字符串不是空的)+
- 无需使用
和^
,因为$
尝试将模式与整个字符串匹配.matches()
- 在字符类中也不需要转义点(
)
新的演示:真的没有必要这样:
{1,“+s.length()+”}
那么,有什么可以替代它来保证字符串的每个字符都被正确解析呢?你在转义点什么?您没有使用什么\w
?您指定了什么{1,
?为什么要使用从点到下划线的所有代码点的范围来指定这49个代码点?为什么要使用代码单元的数量来指定代码点?当这些数字不匹配时,您会怎么做?&c&c&c&c&D!您想用简单的英语做什么,因为我们永远无法从您的模式中找出它?NullUserException是正确的,您可以将其替换为Kleene运算符“+”。由于您的下限当前为1,我假设您不希望允许长度为零的字符串(您可以使用“*”来实现)。此外,在使用match()时,您不需要“^”和“$”
方法。它测试输入是否与正则表达式完全匹配。当使用find()
逐步扫描字符串时,使用行标记非常有用。确实不需要这样:{1,“+s.length()+”}
那么,有什么可以取代它来保证字符串的每个字符都被正确解析?你在转义点什么?你没有使用什么\w
?你在指定什么{1,
?为什么要使用从点到下划线的所有代码点的范围来指定这49个代码点?为什么要使用代码单元的数量来指定代码点?当这些数字不匹配时,您会怎么做?&c&c&c&c&D!您想用简单的英语做什么,因为我们永远无法从您的模式中找出它?NullUserException是正确的,您可以将其替换为Kleene运算符“+”。由于您的下限当前为1,我假设您不希望允许长度为零的字符串(您可以使用“*”来实现)。此外,在使用match()时,您不需要“^”和“$”
方法。它测试输入是否与正则表达式完全匹配。当使用find()
逐步扫描字符串时,使用行标记非常有用。我发现奇怪的是,如果删除{1,“+s.length()+”},以前的有效字符串现在将被拒绝。如果您找到[^\w\s.-]
,它会使字符串无效。@Morgan先生-不要简单地删除它,用+
替换它。我觉得奇怪的是,如果我删除了{1,“+s.length()+”},以前有效的字符串现在会被拒绝。如果你找到[^\w\s.-]
,它会使字符串无效。@Morgan先生-不要简单地删除它,用+
替换它。这很好。但它可以扩展到包括双筒名称,如fitzwilliam smythe或5000.00 as 500吗