在java的正则中,很多时候以为^表示的含义就是字符的开始,其实^放在[]时,表示的并非开始的意思,而是排除和非的意思。
例如有个需求,需要在一个字符串中找出被数字包围的子串
直接上代码
public static void main(String[] args) {
String reg = "\\d+([^\\d]+)\\d+";
String str1 = "AA123baidu678EEdd";
System.out.println("result1: "+str1.replaceAll(reg, "$0"));//替换为reg表示的整个内容
System.out.println("result2: "+str1.replaceAll(reg, "$1"));//替换为reg的第一个()内表示的内容
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(str1);
while (m.find()) {
//System.out.println("ip:" + m.group());
System.out.println("group--> " + m.group(1));//获取reg的第一个()内表示的内容
}
}
运行结果:
result1: AA123baidu678EEdd
result2: AAbaiduEEdd
group--> baidu
解析
下面解析 String reg = "\\d+([^\\d]+)\\d+";
左边的\\d+ : 表示数字开头,出现一次或多次
([^\\d]+) :
()表示一个组
[^\\d] 这里的^表示除数字之外的字符
[^\\d]+ 后面多一个+号表示出现一次以上
整个括号表示非数字的字符
\\d+
最后的\\d+ :也是表示数字,这里就是结尾
所以整个 \\d+([^\\d]+)\\d+ 就是表示匹配一个两头是数字、中间非数字的字符串