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

news/2025/5/18 10:24:37

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


(?: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://blog.csdn.net/weixin_30905133/article/details/97551083
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://dhexx.cn/news/show-18665.html

相关文章

ElasticSearch 搜索引擎入门到实战 17-- 聚合查询之桶聚合

ES聚合分析 聚合分析是数据库中重要的功能特性&#xff0c;完成对⼀个查询的数据集中数据的聚合计算&#xff0c;如&#xff1a;找出某字段&#xff08;或计算表达式的结果&#xff09;的最⼤值、最⼩值&#xff0c;计算和、平均值等。ES作为搜索引擎兼数据库&#xff0c;同样…

【初窥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…

linux 退出命令输入密码,linux终端中输入什么指令可以退出终端?

linux系统自带的是vi编辑器&#xff0c;在使用vim还得安装redhat/debian/fedora用yum install vim命令&#xff0c;debian/ubutnu/ubuntukylin用sudo apt-get install vim&#xff0c;两种方法都得用root权限安装。具体如下&#xff1a;1、简介Linux操作系统是基于UNIX操作系统…

[复变函数]第17堂课 5 解析函数的 Laurent 展式与孤立奇点 5. 1 解析函数的 Laurent 展式...

0. 引言 (1) $f$ 在 $|z|<R$ 内解析 $\dps{\ra f(z)\sum_{n0}^\infty c_nz^n}$ (Taylor 级数). (2) $f$ 在 $r<|z|<R\ (0\leq r<R\leq\infty)$ 内解析 $\dps{\ra f(z)?}$ (Laurent 级数). 1. 双边幂级数 (1) 定义 $$\bee\label{15_bs} \bea &\quad c_0c_…

ElasticSearch 搜索引擎入门到实战 18-- query_string查询

query_string 查询&#xff0c;如果熟悉lucene的查询语法&#xff0c;我们可以直接⽤lucene查询语法写⼀个查询串进⾏查询&#xff0c;ES中接到请求后&#xff0c;通过查询解析器,解析查询串⽣成对应的查询。 指定单个字段查询 POST /nba/_search {"query": {"…

linux删除del后缀文件,Linux_dos 文件删除 del命令,del命令的用法很简单,使用 de - phpStudy...

dos 文件删除 del命令del命令的用法很简单&#xff0c;使用 "del 文件路径" 的格式就可以了。比如&#xff0c;想删除D盘根目录下的test.txt&#xff0c;使用del d:\test.txt即可。但是&#xff0c;并不是所有的文件都可以只用del命令就可以搞定&#xff0c;比如具有…

在线教程

java 知识体系 http://gdkmrjxh.blog.163.com/blog/static/1746672662010111005955258/ java基础教程 http://www.51zxw.net/list.aspx?cid380 转载于:https://www.cnblogs.com/ygm900/archive/2013/04/25/3042391.html

String,StringBuffer与StringBuilder的理解

String 字符串常量StringBuffer 字符串变量&#xff08;线程安全&#xff09;StringBuilder 字符串变量&#xff08;非线程安全&#xff09; 简 要的说&#xff0c; String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进…

emacs自动补全插件auto-complet和yasnippet,安装、配置和扩展

这段时间突然闲了起来&#xff0c;就又折腾折腾emacs. 一直想解决自动补全的功能&#xff0c;因为这时现代开发环境必备的特色。google了一下&#xff0c;很多使用auto-complete和yasnippet的&#xff0c;于是自己动手装了起来。先查阅安装文档&#xff0c;又参考别人的方法&am…

linux命令chcon,selinux --chcon命令

//If you want to setup a directory where you can upload files&#xff1c;如果你想让你设置的FTP目录可以上传文件的话&#xff0c;SELINUX需要设置&#xff1e; chcon -t public_content_rw_t /var/ftp/incoming//You must also turn on the boolean allow_ftpd_anon_writ…