正则表达式-零宽度断言详解
2014-04-15 23:24
375 查看
零宽度断言是正则表达式中一种重要方法,它主要用于捕获指定内容之前或之后的字符串。
比如有一字符串“ID=1234567”,仅想捕获ID的具体内容“1234567”,而不需要捕获字符串“ID=”,这里就可以用非捕获组(?:ID=)[b](\d+)[/b]
上面这种情况属于捕获特征内容X之前的字符串。
现在看另外一种情况,比如有现在有一字符串"www.baidu.com", (?=baidu)(.+)捕获的结果是什么呢?
可见捕获的是以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\.)(.+)得到的结果是什么呢?
运行结果:
它捕获的的是指定内容之后的字符串。
那(.+)[b](?<=\.com)又将得到什么结果呢?[/b]
运行结果:
它捕获的是以".com"为结尾的字符串。
总结一下:
如果(?<=X)放在左边例如 (?<=www\.)(.+),是捕获"www."后面的字符串,但不捕获"www."。
如果(?<=x)放在右边例如(.+)(?<=\.com),是捕获以".com"结尾的字符串。
[b](?<!X):
[/b]
与(?<=X)相反,!相当于“不等于”的意思。
如果(?<!X)放在左边例如(?<!www\.)(.+),是待捕获的字符串前面不能是"www."。
如果(?<!X)放在右边例如(\w+)(?!\.com),表明待捕获的字符串不能以".com"结尾。
(?: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"结尾。
相关文章推荐
- msql 正则表达式
- 正则表达式
- Mootools 1.2教程 正则表达式
- 批处理FINDSTR正则表达式用法实例分析
- vbs正则表达式代码
- php中看实例学正则表达式
- PHP正则表达式之定界符和原子介绍
- PHP下常用正则表达式整理
- 批处理 正则表达式(findstr) 整理
- 学习正则帮手笨狼正则练习器
- java正则表达式应用的实例代码
- ruby 正则表达式 教程
- PHP中的正则表达式函数介绍
- javascript replace方法与正则表达式
- 关于Perl里面正则表达式规范
- PERL 正则表达式详细说明
- JavaScript通过正则表达式实现表单验证电话号码
- 用正则表达式 动态创建/增加css style script 兼容IE firefox
- 使用Ruby re模块创建复杂的正则表达式
- javascript 正则表达式相关应介绍