日期:2014-05-20  浏览次数:20809 次

关于正则表达式边界适配器“\B”的问题!
    小弟初学Java,遇到以下问题不明,在CSDN中找了半天也没找到答案,或者是那答案以我目前的水平看不懂!小弟才学到正则表达式,属于基础中的基础,所以希望有达人用我目前能够听懂的方式帮我解惑!

    今天发现一问题,就是在正则表达式中,我们知道边界匹配器中\w的意思是非字母边界!
但是在我进行了验证之后,发现,这一边界适配器的定义有问题:源代码如下:
/**
* <pre>
* \w 单词字符:[a-zA-Z_0-9] 

*  边界匹配器 
                 ^ 行的开头 
                 $ 行的结尾 
                 \b 单词边界 
                 \B 非单词边界 
                 \A 输入的开头 
                 \G 上一个匹配的结尾 
                 \Z 输入的结尾,仅用于最后的结束符(如果有的话)
                 \z 输入的结尾

* </pre>
* */
public class Demo1 {
        public static void main(String[] args) {
                String str = "aaddccd";
                System.out.println(str.matches("\\b\\w+\\b"));//true
                String str2 = "aaddccd.";
                System.out.println(str2.matches("\\b\\w+\\B"));//flase
                String str3 = "aaddccd!";//按照\w的定义,!应该是非单词字符
                System.out.println(str3.matches("\\b\\w+\\B"));//flase
                String str4 = "~";//同理:按照\w的定义,~应该是非单词字符
                System.out.println(str4.matches("\\B"));//flase
                String str5 = "|";
                System.out.println(str5.matches("\\B"));//flase
        }
}


    其中我进行了多方测试,均不能返回true!

根据API文档的翻译,我们知道\w表示的意思:
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]

    也就是说像“~、!、#”等符号都是非单词符号的,应该能够使用\B进行验证的。如上面的代码,我专门测试了\B(如第4、5个例子),发现还是返回的false。

不知道这是怎么回事,是JDK的定义问题?还是我未发现的小细节出了问题?求达人解惑,以上代码大家可以拷贝试一下!
正则表达式 \B 边界适配器

------解决方案--------------------
\\b并不是用来匹配具体字符的。。它是匹配一个"位置"
如果你了解正则表达式的"环视",那应该就知道是什么意思了
举个简单的例子

Pattern pattern = Pattern.compile("\\w+\\b");
        Matcher matcher = pattern.matcher("aaabbcc ff");