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

news/2024/5/18 22:03:40

零宽度断言是正则表达式中一种重要方法,它主要用于捕获指定内容之前或之后的字符串


(?: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"结尾。

转载于:https://www.cnblogs.com/xiaogua918/p/4181583.html


https://dhexx.cn/news/show-18665.html

相关文章

【初窥javascript奥秘之Ajax】简述下你所知道的Ajax?

【初窥javascript奥秘之Ajax】简述下你所知道的Ajax&#xff1f; 原文 http://www.cnblogs.com/yexiaochai/archive/2013/04/24/3037069.html 【初窥javascript奥秘之Ajax】简述下你所知道的Ajax&#xff1f; 前言 ajax已经流行很多年了&#xff0c;现在来说它是否已经晚了呢&a…

数字总和排列二叉树模型求解

题目的原型来自于前段时间在论坛上看到的一道水友分享的一道卓越亚马逊的笔试算法题&#xff0c;题目如下&#xff1a; 每个大于1的数字都可以由其他数字相加组合而成&#xff0c;例如&#xff1a; 514, 523&#xff1b; 716, 725, 734&#xff1b; 现要求输入正整数n&#xff…

samba没有权限写入linux,Redhat 7安装Samba服务后只能读取目录,无法写入的处理办法...

今天在RedHat 7安装samba服务的时候&#xff0c;系统中已经设置了用户为smb1,用户组为users[global]netbios name SERVER.REDHAT.SUNserver string Samba Server Version %vlog file /var/log/samba/log.%mmax log size 50load printers Noidmap config * : backend tdbc…

ASP.NET是如何在IIS下工作的

原文地址&#xff1a;http://www.cnblogs.com/fengzheng/p/3668283.html ASP.NET与IIS是紧密联系的&#xff0c;由于IIS6.0与IIS7.0的工作方式的不同&#xff0c;导致ASP.NET的工作原理也发生了相应的变化。 IIS6(IIS7的经典模式)与IIS7的集成模式的不同 IIS6的运行过程&#…

10 款精美的 CSS3 全新特效

大家都知道&#xff0c;在网页制作时使用CSS技术&#xff0c;可以有效地对页面的布局、字体、颜色、背景和其它效果实现更加精确的控制。只要对相应的代码做一些简单的修改&#xff0c;就可以改变同一页面的不同部分&#xff0c;或者页数不同的网页的外观和格式。CSS3是CSS技术…

Sharding-JDBC分库分表 概述 [文档]

Sharding-Sphere概述 在介绍Sharding-JDBC之前&#xff0c;我们需要先说明下Sharding-Sphere。 Sharding-Sphere是一套开源的分布式数据库中间件解决方案组成的生态圈&#xff0c;它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar&#xff08;计划中&#xff09;这3款相互…

什么是垂直分库分表,水平分库分表

垂直分片 按照业务拆分的方式称为垂直分片&#xff0c;又称为纵向拆分&#xff0c;它的核心理念是专库专用。 在拆分之前&#xff0c;一个数据库由多个数据表构成&#xff0c;每个表对应着不同的业务。而拆分之后&#xff0c;则是按照业务将表进行归类&#xff0c;分布到不同的…

函数、递归 与 闭包(执行环境、变量对象 与 作用域链)

函数表达式 1、JavaScript中定义函数有2钟方法&#xff1a; 1-1.函数声明&#xff1a; function funcName(arg1,arg2,arg3){//函数体 } ①name属性&#xff1a;可读取函数名。非标准&#xff0c;浏览器支持:FF、Chrome、safari、Opera。    ②函数声明提升&#xff1a;指执…

linux环境nutch的配置,Nutch 1.3 在Ubuntu上的简单配置

因为Nutch 1.3跟以前比改了不少东西&#xff0c;所以1.2中的有些配置已经不在适用了首先我的机器用的是Ubuntu 10.04,挺老的版本了&#xff0c;因为有它的光盘&#xff0c;一直没有升级当然是先下载nutch的包了&#xff0c;用的人人的镜像http://labs.renren.com/apache-mirror…

Sharding-JDBC(版本3.0) 入门demo-1,纯java 代码

先创建ds_0,ds_1两个数据库&#xff0c;并同时在两个数据库中创建表t_order_0,t_order_1两个表 CREATE TABLE t_order_0 (order_id int(11) DEFAULT NULL,user_id int(11) DEFAULT NULL,status varchar(50) DEFAULT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8; 1 新建maven项目…