您的位置:首页 > 其它

正则表达式-零宽度断言详解

2014-04-15 23:24 375 查看
零宽度断言是正则表达式中一种重要方法,它主要用于捕获指定内容之前或之后的字符串

(?:X):非捕获组

它用于捕获包含某一段特征内容X的字符串,但并不捕获特征内容X

比如有一字符串“ID=1234567”,仅想捕获ID的具体内容“1234567”,而不需要捕获字符串“ID=”,这里就可以用非捕获组(?:ID=)[b](\d+)[/b]

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());  //获得与正则表达式整体匹配的字符串
}
}

运行结果:



它捕获的的是指定内容之后的字符串。

(.+)[b](?<=\.com)又将得到什么结果呢?[/b]

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"结尾的字符串。


[b](?<!X):
[/b]
与(?<=X)相反,!相当于“不等于”的意思。

如果(?<!X)放在左边例如(?<!www\.)(.+),是待捕获的字符串前面不能是"www."。
如果(?<!X)放在右边例如(\w+)(?!\.com),表明待捕获的字符串不能以".com"结尾。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息