正则表达式-零宽度断言详解
零宽度断言是正则表达式中一种重要方法,它主要用于捕获指定内容之前或之后的字符串。
(?:X):非捕获组
它用于捕获包含某一段特征内容X的字符串,但并不捕获特征内容X
比如有一字符串“ID=1234567”,仅想捕获ID的具体内容“1234567”,而不需要捕获字符串“ID=”,这里就可以用非捕获组(?:ID=)(\d+)
public static void main(String args []){ Pattern p = Pattern.compile("(?:ID=)(\\d+)"); //编译正则表达式 Matcher m = p.matcher("ID=1234567"); if(m.find()) { System.out.println(m.group(1)); //获得分组1的内容即(\d+)所捕获的内容 System.out.println(m.group(0)); //获得与正则表达式整体匹配的字符串,group(0)与group()等效 System.out.println(m.group()); //获得与正则表达式整体匹配的字符串 } }运行结果:
(?=X):
用于捕获以特征内容X开头的字符串或者捕获特征内容X之前的字符串。
比如有一字符串"baidu.com",仅想捕获“baidu”,而不需要捕获".com",这里可以使用(\w+)(?=\.com)
public static void main(String args []){ Pattern p = Pattern.compile("(\\w+)(?=\\.com)"); Matcher m = p.matcher("www.baidu.com"); if(m.find()) { System.out.println(m.group(1)); //获得分组1的内容,即(\w+)所捕获内容 System.out.println(m.group(0)); //获得与正则表达式整体匹配的字符串 System.out.println(m.group()); //获得与正则表达式整体匹配的字符串 } }运行结果:
上面这种情况属于捕获特征内容X之前的字符串。
现在看另外一种情况,比如有现在有一字符串"www.baidu.com", (?=baidu)(.+)捕获的结果是什么呢?
public static void main(String args []){ Pattern p = Pattern.compile("(?=baidu)(.+)"); Matcher m = p.matcher("www.baidu.com"); if(m.find()) { System.out.println(m.group(1)); //获得分组1的内容 System.out.println(m.group(0)); //获得与正则表达式整体匹配的字符串 System.out.println(m.group()); //获得与正则表达式整体匹配的字符串 } }运行结果:
可见捕获的是以baidu开头的字符,而且捕获了baidu。
总结一下:如果(?=X)放在左边例如 (?=baidu)(.+),是捕获以baidu开头的字符串。
如果(?=x)放在右边例如(\w+)(?=\.com),是捕获.com之前的字符串,并且不捕获.com
(?!X):
与(?=X)相反,!相当于“不等于”的意思。
如果(?!X)放在左边例如 (?!baidu)(.+),是捕获不以baidu开头的字符串。
如果(?!X)放在右边例如(\w+)(?!\.com),表明待捕获字符串后面不能是.com。
(?<=X):
捕获指定内容X之后的字符串或捕获以指定内容X结尾的字符串
还是以"www.baidu.com"为例,(?<=www\.)(.+)得到的结果是什么呢?
public static void main(String args []){ Pattern p = Pattern.compile("(?<=www\\.)(.+)"); Matcher m = p.matcher("www.baidu.com"); if(m.find()) { System.out.println(m.group(1)); //获得分组1的内容 System.out.println(m.group(0)); //获得与正则表达式整体匹配的字符串 System.out.println(m.group()); //获得与正则表达式整体匹配的字符串 } }
运行结果:
它捕获的的是指定内容之后的字符串。
那(.+)(?<=\.com)又将得到什么结果呢?
public static void main(String args []){ Pattern p = Pattern.compile("(.+)(?<=\\.com)"); Matcher m = p.matcher("www.baidu.com"); if(m.find()) { System.out.println(m.group(1)); //获得分组1的内容 System.out.println(m.group(0)); //获得与正则表达式整体匹配的字符串 System.out.println(m.group()); //获得与正则表达式整体匹配的字符串 } }
运行结果:
它捕获的是以".com"为结尾的字符串。
总结一下:
如果(?<=X)放在左边例如 (?<=www\.)(.+),是捕获"www."后面的字符串,但不捕获"www."。
如果(?<=x)放在右边例如(.+)(?<=\.com),是捕获以".com"结尾的字符串。
(?<!X):
与(?<=X)相反,!相当于“不等于”的意思。
如果(?<!X)放在左边例如(?<!www\.)(.+),是待捕获的字符串前面不能是"www."。
如果(?<!X)放在右边例如(\w+)(?!\.com),表明待捕获的字符串不能以".com"结尾。
posted on 2014-04-15 23:24 xiaogua918 阅读(965) 评论(1) 编辑 收藏 举报