System.out.println("aaa 88888c".matches(".{3}\\b\\d{5}."));  有问题,把3改成4就正确了
这个正则表达式,前边是三个字母,接着是一个空格,但是却是错误的,把3改为4,就正确,
----总是理解不好,请高手讲一下这是为什么?背后的原理是什么?

解决方案 »

  1.   

    System.out.println("aaa 88888c".matches(".{3}\\b\\d{5}.")); ---false
    System.out.println("aaa 88888c".matches(".{4}\\b\\d{5}."));  ---true
    why??????????
      

  2.   

    首先你要明白\b的意思。\b匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符。
    进一步说明:"\b" 与 "^" 和 "$" 类似,本身不匹配任何字符,但是它要求它在匹配结果中所处位置的左右两边,其中一边是 "\w" 范围,另一边是 非"\w" 的范围。\b代表字与字中间那个看不见的东西,如:
    here is a word 
    那么,这句中有好几个\b, 每个单词的前后都有一个\b.
    所以你用 \bhere\b 可以匹配上面这个here,但如果here 不是一个单词,而是一个单词的一部分,如adheread,这样的话,用here可以匹配,用\bhere\b就不能区配了,因为ad后面没有\b. 所以 adhere 中的here 不会被匹配。
    总结:\b 就是用在你匹配整个单词的时候。 如果不是整个单词就不匹配。 你想匹配 I 的话,你知道,很多单词里都有I的,但我只想匹配I,就是“我”,这个时候用\bI\b。
     
    对于本题:
    由于\b本身不匹配任何字符,所以如果写成(".{3}\\b\\d{5}.")的话,aaa后面的空格就没有匹配,所以是false。
    当然你写成System.out.println("aaa 88888c".matches(".{3}\\b.\\d{5}."));也是对的。
      

  3.   

    空格你没有验证啊 \\s 匹配空格
    System.out.println("aaa 88888c".matches(".{3}\\b\\d{5}.")); 
    这个我知道,
    三个字符+一个空格+四个数字+一个字母
    正则式(".{3}配对前三个字符才对,为何用(".{4}配对啊?---这个是我要问的问题?
      

  4.   

    因为.也匹配空格,所以".{4}"匹配"aaa "
      

  5.   

    这样\\s匹配空格的形式在这里启什么作用
    (".{4}匹配aaa和空格
    \\s还匹配空格,
    ----这样不就空格匹配两次了??????
      

  6.   

    System.out.println("aaa 88888c".matches(".{3}\\b\\d{5}.")); --false
    System.out.println("aaa 88888c".matches(".{4}\\b\\d{5}.")); ---true三个字符+一个空格+四个数字+一个字母 
      

  7.   

    我的意思是(".{3}\\b\\s
    如果用了{4}就不用\\s了,否则用\s匹配空白符(包括空格)