2011-08-27 101 views
0

我试图通过Java中的正则表达式过滤器,只允许特定的词,即:排除在Java正则表达式正斜杠话

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

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

任何人都可以提出修复我当前的版本?

我是新来的正则表达式,并没有特别关注它。

的正则表达式是在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不被接受。

+0

真的没有必要为此:'{1, “+ s.length()+”}' – NullUserException

+0

那么,什么可能取代它,以保证字符串的每个字符正确解析? –

+0

你在逃避什么?你使用'\ w'不是什么?你在指定什么?{1,'?你为什么使用从点到下划线**的所有代码点的范围来指定那些* 49 *代码点?你为什么使用代码数*单位*来指定代码*点*?这些数字不匹配时你会做什么? &C&C&C&C&C&死!你想用简单的英语来做什么,因为我们永远不会从你的困境中想出来? – tchrist

回答

1

你可以使用

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

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

+0

这很好。但是是否可以扩展到包含fitzwilliam-smythe这样的双筒名称或5000.00是5000.00的双筒名称? –

+0

@Mr这已经匹配'fitzwilliam-smythe',如果你想允许逗号,你可以在字符类中加入逗号(例如:'[\\ w \\ s。, - ] +')。 – NullUserException

+0

要检查逗号是否被用作千位分隔符,只有接受它才会给正则表达式IMO增加不必要的复杂性,但可以完成。 – NullUserException

4

是因为连字符是第二个到最后你的字符集,因此被定义为'_'范围从'.',其中包括'/'

试试这个:

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

此外,NullUserException是正确的,没有必要{1," + s.length() + "}。你用'^'开始表达并用'$'结束它的事实将确保整个字符串被消耗。

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

+0

我觉得奇怪的是,如果我删除{1,“+ s.length()+”},以前有效的字符串现在正在拒绝。 –

+0

如果您发现'[^ \ w \ s .-]',它会使字符串失效。 – tchrist

+0

@ Morgan Morgan - 不要简单地将其删除,用'+'替换它。 – erickson