在Java正则表达式中排除带正斜杠的单词

时间:2011-08-27 15:40:32

标签: java regex

我试图通过Java中的正则表达式过滤器只允许某些单词,即:

Pattern p = Pattern.compile("^[a-zA-Z0-9\\s\\.-_]{1," + s.length() + "}$");

但我发现它允许通过140公里/小时,因为没有处理正斜杠。理想情况下,不应该允许这个词。

有人可以建议修复我当前的版本吗?

我是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)的字符串,但不接受5,000.00。

2 个答案:

答案 0 :(得分:4)

是因为连字符在你的字符集中倒数第二,因此定义了从'.''_'的范围,其中包括'/'

试试这个:

Pattern p = Pattern.compile("^[a-zA-Z0-9\\s\\._-]$");

此外,NullUserException是正确的,因为不需要{1," + s.length() + "}。您使用'^'开始表达并以'$'结束表达的事实将确保使用整个字符串。

最后,您可以使用\w代替[a-zA-Z_0-9],将您的表达简化为"^[\\w\\s\\.-]$"

答案 1 :(得分:1)

你可以使用

public static boolean checkStringAlphaNumericChars(String s) { 
    return (s != null) && s.matches("[\\w\\s.-]+"); 
}
  • 当您尝试对s进行null时,短路空检查会确保.matches()不是\w
  • 使用[A-Za-z0-9_]查找字母数字加上下划线。 tchrist也将是第一个指出这比+
  • 更正确的人
  • 最后的^确保您至少有一个字符(即:字符串不为空)
  • 由于$尝试将模式与整个字符串相匹配,因此无需使用.matches().
  • 也无需在字符类中转义点({{1}})。

新演示:http://ideone.com/qraob