正则表达式,\B:非单词边界,
String str = "b4aab";
String regex = "\Ba\B";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
System.out.println(m.matches());
String regex = "\Ba\B";//这个正则表达式的意思是不是不以单词a为边界
字符串"b4aab"应该和这个正则表达式匹配,那么返回结果应该为true
但程序运行结果为false
请教大家解决一下
谢谢...
[b]问题补充:[/b]
楼下的说详细点,还是不怎么懂这个\B
话说楼主就不试试lookingAt()和find()了么……
[code="java"]import java.util.regex.*;
public class Test {
public static void main(String[] args) {
String str = "b4aab";
String regex = "\Ba\B";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
System.out.println(m.find()); // true
}
}[/code]
\B就是非单词边界,也就是这样一个位置,其左边与右边要么同时能够被\w匹配,要么同时能够被\W匹配。所有“边界”都是长度为零的匹配,匹配的是“位置”而不是字符序列。Java里\w是[a-zA-Z_0-9],而\W是[^\w]。
如果有这样一个字符串,"!aab",然后用"\Ba\B"通过find()去匹配,那么第一个匹配会是下标为2的a,因为在匹配到第一个a的时候,其左边是一个单词边界,无法满足\B的匹配条件。如果用同一个正则表达式去匹配"_aab",那么第一个匹配就会是下标为1的那个a,道理同上。
String regex = "\Ba\B";//这个正则表达式的意思是第一个字符不以单词为边界,再后面就是跟着一个字符'a',然后再不以单词为结尾
字符串"b4aab"和这个正则表达式当然不匹配
b4aab这一整串都是单词,就变成以单词为开头
因为Matcher.matches()是对整个字符串做匹配,等同于对pattern添加了^...$,这里很明显"b4aab"不能被"^\Ba\B$"模式所匹配,所以matcher()返回false。
Matcher上有三种方法来寻找匹配,matches()、lookingAt()和find()。第一种已经说了,第二种是从输入的开头开始寻找匹配,第三种是从上次匹配结束后的位置开始寻找匹配。这里用lookingAt()或者find()都能达到楼主需要的效果。
边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
\B 非单词边界
\A 输入的开头
\G 上一个匹配的结尾
\Z 输入的结尾,仅用于最后的结束符(如果有的话)
\z 输入的结尾