String str = "^[-A-Za-z0-9\\ /]+$";
Pattern p=Pattern.compile(str);
Matcher m=p.matcher("111aawe\rrt-y/");
boolean rs=m.find();
System.out.println(rs);111aawe\rrt-y/ 应该符合上面的正则表达式,为什么执行结果是false呢.把111aawe\rrt-y/里的\去了就是true了,帮忙解决下,谢谢!

解决方案 »

  1.   

    String str = "^[-A-Za-z0-9\\\\ /]+$"; 
      

  2.   

    "\r"被视做回车符 ('\u000D')。不在[-A-Za-z0-9\\/]内。
    正则表达式 ^ 和 $ 忽略行结束符,仅分别与整个输入序列的开头和结尾匹配。另,如果你允许字符串中存在"\",参照1楼的写法。
      

  3.   

    你这里需要明确一点,反斜线在java中是用来转译的或代表一些字符。
    如你这里的\r表示的就是制表符,\n回车符等等。
    其实我估计你的这个意思不是匹配\r而是允许出现“\”。正则表达式中单独出现的反斜线字符,在正则表达式的层面,必须以转义序列‘\\’来表示,
    然而,每个反斜线,在表示正则表达式的字符串中,又必须以转义序列‘\\’来表示。
    所以,在字符串中,必须写出四个反斜线‘\\\\’,才能对应到正则表达式中单独出现的一个反斜线字符:
    在字符串处理层面,它们会被识别为两个反斜线‘\\’,在正则表达式的层面,它们会被识别为单个反斜线字符‘\’。在你写的代码中,正好赶巧了。你正好写的是“\r”.如果你换成“\d”就会报错的。你大概的意思,可能是下面代码的意思。
                      String str = "^[-A-Za-z0-9\\\\ /]+$"; 
    Pattern p=Pattern.compile(str);
    String ss = "111\\aa\\rwerrdt-y/";
    Matcher m=p.matcher(ss); 
    boolean rs=m.find(); 
    System.out.println(rs); 
      

  4.   

    谢谢楼上各位,但是还有点问题
    String str = "^[-A-Za-z0-9\\\\/]+$";
    Pattern p=Pattern.compile(str);
    Matcher m=p.matcher("ahsdu-7\0/8/9");
    boolean rs=m.find();
    System.out.println(rs);当匹配的String是一个\再后面跟数字的情况,还是false.比如ahsdu-7\0/8/9
      

  5.   

    你需要了解一下转义字符有哪些
    1.八进制转义序列:\ + 1到3位5数字;范围'\000'~'\377'
     \0:空字符
    2.Unicode转义字符:\u + 四个十六进制数字;0~65535
     \u0000:空字符
    3.特殊字符:
     \":双引号
     \':单引号
     \\:反斜线
    4.C0控制字符:
     \b:退格
     \t:tab
     \n:换行
     \f:换页
     \r:回车