java正则断言_Java正则表达断言篇

正则表达式的先行断言和后行断言一共有4种形式:

(?=pattern) 零宽正向先行断言(zero-width positive lookahead assertion)

(?!pattern) 零宽负向先行断言(zero-width negative lookahead assertion)

(?<=pattern) 零宽正向后行断言(zero-width positive lookbehind assertion)

(?

这里面的pattern是一个正则表达式。

如同^代表开头,$代表结尾,\b代表单词边界一样,先行断言和后行断言也有类似的作用,它们只匹配某些位置,在匹配过程中,不占用字符,所以被称为“零宽”。所谓位置,是指字符串中(每行)第一个字符的左边、最后一个字符的右边以及相邻字符的中间(假设文字方向是头左尾右)。

下面分别举例来说明这4种断言的含义。

(?=pattern) 正向先行断言

代表字符串中的一个位置,紧接该位置之后的字符序列能够匹配pattern。

例如对”a regular expression”这个字符串,要想匹配regular中的re,但不能匹配expression中的re,可以用”re(?=gular)”,该表达式限定了re右边的位置,这个位置之后是gular,但并不消耗gular这些字符,将表达式改为”re(?=gular).”,将会匹配reg,元字符.匹配了g,括号这一砣匹配了e和g之间的位置。

(?!pattern) 负向先行断言

代表字符串中的一个位置,紧接该位置之后的字符序列不能匹配pattern。

例如对”regex represents regular expression”这个字符串,要想匹配除regex和regular之外的re,可以用”re(?!g)”,该表达式限定了re右边的位置,这个位置后面不是字符g。负向和正向的区别,就在于该位置之后的字符能否匹配括号中的表达式。

(?<=pattern) 正向后行断言

代表字符串中的一个位置,紧接该位置之前的字符序列能够匹配pattern。

例如对”regex represents regular

expression”这个字符串,有4个单词,要想匹配单词内部的re,但不匹配单词开头的re,可以用”(?<=\w)re”,单词内部的re,在re前面应该是一个单词字符。之所以叫后行断言,是因为正则表达式引擎在匹配字符串和表达式时,是从前向后逐个扫描字符串中的字符,并判断是否与表达式符合,当在表达式中遇到该断言时,正则表达式引擎需要往字符串前端检测已扫描过的字符,相对于扫描方向是向后的。

(?

代表字符串中的一个位置,紧接该位置之前的字符序列不能匹配pattern。

例如对”regex represents regular

expression”这个字符串,要想匹配单词开头的re,可以用”(?

对于这4个断言的理解,可以从两个方面入手:

1.关于先行(lookahead)和后行(lookbehind):正则表达式引擎在执行字符串和表达式匹配时,会从头到尾(从前到后)连续扫描字符串中的字符,设想有一个扫描指针指向字符边界处并随匹配过程移动。先行断言,是当扫描指针位于某处时,引擎会尝试匹配指针还未扫过的字符,先于指针到达该字符,故称为先行。后行断言,引擎会尝试匹配指针已扫过的字符,后于指针到达该字符,故称为后行。

2.关于正向(positive)和负向(negative):正向就表示匹配括号中的表达式,负向表示不匹配。

对这4个断言形式的记忆:

1.先行和后行:后行断言(?<=pattern)、(?

2.正向和负向:不等于(!=)、逻辑非(!)都是用!号来表示,所以有!号的形式表示不匹配、负向;将!号换成=号,就表示匹配、正向。

我们经常用正则表达式来检测一个字符串中包含某个子串,要表示一个字符串中不包含某个字符或某些字符也很容易,用[^...]形式就可以了。要表示一个字符串中不包含某个子串(由字符序列构成)呢?

用[^...]这种形式就不行了,这时就要用到(负向)先行断言或后行断言、或同时使用。

例如判断一句话中包含this,但不包含that。

包含this比较好办,一句话中不包含that,可以认为这句话中每个字符的前面都不是that或每个字符的后面都不是that。正则表达式如下:

^((?

对于”this is the case”这句话,两个表达式都能够匹配成功,而”note that this is the case”都匹配失败。

在一般情况下,这两个表达式基本上都能够满足要求了。考虑极端情况,如一句话以that开头、以that结尾、that和this连在一起时,上述表达式就可能不胜任了。

如”note thatthis is the case”或者”this is the case, not that”等。

只要灵活运用这几个断言,就很容易解决:

^(.(?

^(.(?

^((?!that).)*this(.(?

^((?!that).)*this((?!that).)*$

这4个正则表达式测试上述的几句话,结果都能够满足要求。

上述4种断言,括号里的pattern本身是一个正则表达式。但对2种后行断言有所限制,在Perl和Python中,这个表达式必须是定长(fixed

length)的,即不能使用*、+、?等元字符,如(?<=abc)没有问题,但(?<=a*bc)是不被支持的,特别是当表达式中含有|连接的分支时,各个分支的长度必须相同。之所以不支持变长表达式,是因为当引擎检查后行断言时,无法确定要回溯多少步。Java支持?、{m}、{n,m}等符号,但同样不支持*、+字符。JavaScript干脆不支持后行断言,不过一般来说,这不是太大的问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346739.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java的对象对象映射_Java对象到对象映射器

java的对象对象映射我在该项目上使用了Dozer一段时间。 但是&#xff0c;最近我遇到了一个非常有趣的错误&#xff0c;这促使我环顾四周&#xff0c;并尝试使用其他“对象到对象”映射器。 这是我找到的工具列表&#xff1a; 推土机&#xff1a;推土机是Java Bean到Java Bea…

java parallelstream_关于Java8 parallelStream并发安全的深入讲解

背景Java8的stream接口极大地减少了for循环写法的复杂性&#xff0c;stream提供了map/reduce/collect等一系列聚合接口&#xff0c;还支持并发操作&#xff1a;parallelStream。在爬虫开发过程中&#xff0c;经常会遇到遍历一个很大的集合做重复的操作&#xff0c;这时候如果使…

Jakarta EE,EE4J和Java EE之间的关系

Jakarta EE的名称已经存在了一个多月&#xff0c;即使Mike Milinkovich在他的博客文章“名称是……”中很好地解释了名称和概念&#xff0c;但对于它们之间的关系仍然有些困惑&#xff0c;我也提出了疑问只要有话题就可以围绕它。 我试图在这里总结一下。 希望能帮助到你&#…

java readline 超时_跳过Java中的BufferedReader readLine()方法

是否有一种简单的方法可以跳过java中的readLine()方法(如果它花费的时间超过2秒)&#xff1f;这是我问这个问题的背景&#xff1a;public void run(){boolean looping true;while(looping) {for(int x 0; xtry {Comm s clientList.get(x);String str s.recieve();// code t…

minwindow java_Java经典算法:最小窗口子字符串

给定一个字符串S和一个字符串T&#xff0c;找到S中的最小窗口&#xff0c;其中将包含T中所有字符的复杂度为O(n)。例如&#xff0c;S “ ADOBECODEBANC”&#xff0c;T “ ABC”&#xff0c;最小窗口为“ BANC”。Java解决方案public String minWindow(String s, String t) {Ha…

j2ee可以用于前端开发吗_用于J2EE开发的Cloud IDE

j2ee可以用于前端开发吗随着许多传统软件工具进入云计算&#xff0c;我想看看它们与传统工具的比较。 我的兴趣是J2EE技术​​&#xff0c;并开始寻找一种云服务&#xff0c;该服务使我能够开发&#xff0c;测试和部署J2EE应用程序。 我很快发现&#xff0c;许多云IDE是为Web前…

java为什么全是乱码_java一切乱码的解释 以及源头

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼InputStreamReader in new InputStreamReader(new FileInputStream(“demo.txt”),”UTF-8”);给InputStreamReader指定解码编码&#xff0c;这样二者统一就不会出现乱码了。下面说说字符输出流。字符输出流的原理和字符输入流的原…

JAVA连接数据库ij_Derby 客户端 ij使用

Derby是开源的、嵌入式的Java数据库程序&#xff0c;ij是Derby提供的客户端工具&#xff0c;相当于其他数据库提供的sqlplus工具。ij是纯Java的程序&#xff0c;不用安装&#xff0c;使用起来就像运行普通的Java应用程序一样。接下来说下&#xff1a;如何使用ij工具去操作数据库…

使用Google Cloud Storage托管您的Maven工件

如果您使用Google Cloud并将Java用于项目&#xff0c;那么Google Cloud Storage是托管团队工件的理想场所。 它很容易设置&#xff0c;而且很便宜。 如果您对它们的功能不特别感兴趣&#xff0c;那么它比设置现有存储库选项&#xff08;jfrog&#xff0c;nexus&#xff0c;arc…

java+map对象判断空值_java判断map中是否存在指定对象

Map判断是否包含指定的value使用containsValue方法。(推荐&#xff1a;java视频教程)定义containsValue(Object value) 如果此映射将一个或多个键映射到指定值&#xff0c;则返回 true示例&#xff1a;/**** Map集合判断是否包含value**/public class MapDemo{public static vo…

mysql 主主模式优缺点_mysql主主同步模式

主192.168.56.20 和 从都新建数据库db1 db2 db3(如果数据库在用&#xff0c;需要上锁后手动从主备份&#xff0c;然后在从恢复)mysql> create database db1;Query OK, 1 row affected (0.00 sec)mysql> create database db2;Query OK, 1 row affected (0.00 sec)mysql>…

spring 类型转换器_Spring中的类型转换

spring 类型转换器以下是一些需要类型转换的简单情况&#xff1a; 情况1。 为了帮助简化bean配置&#xff0c;Spring支持属性值与文本值之间的转换。 每个属性编辑器仅设计用于某些类型的属性。 为了使用它们&#xff0c;我们必须在Spring容器中注册它们。 案例2。 同样&…

java+语音识别+谷歌_JAVA使用谷歌语音识别API

我正在尝试使用谷歌语音识别API.这是我写的代码&#xff1a;有用.我从服务器得到答案&#xff1a;{"status":5,"id":"8803471b14a2310dfcf917754e8bd4a7-1","hypotheses":[]}现在的问题是“状态&#xff1a;5”.事实上,这里的状态代码…

java中对象字节数_JAVA中求解对象所占字节大小

该类为cache4j缓存框架中的工具类方法&#xff0c;该方法实现了两个接口接口1&#xff1a;计算对象在内存中所占字节数接口2&#xff1a;复制对象&#xff0c;实现深度克隆效果&#xff0c;实现原理为先序列化对象&#xff0c;然后在反序列化对象&#xff1b;返回一个新的对象&…

excel查重复_毕业季 | 如何降低论文的查重率

毕业季吾日三省吾身实验做完了吗&#xff1f;论文写完了吗&#xff1f;查重能通过吗&#xff1f;学术圈的前辈告诉我们&#xff0c;只有站在巨人的肩膀上才能看得更远。在撰写一篇论文时&#xff0c;为保证质量和可靠性&#xff0c;难免需要引用前人的成果&#xff0c;这也反映…

Sun过去的世界中的JDK 11和代理

使用JDK 11后&#xff0c;就sun.misc.Unsafe的第一种方法。 其中&#xff0c; defineClass方法已删除。 代码生成框架通常使用此方法在现有的类加载器中定义新的类。 尽管此方法易于使用&#xff0c;但它的存在也使JVM本质上不安全&#xff0c;正如其定义类的名称所暗示的那样。…

java中 private final_Java笔记:final与private关键字

记录一个有趣的现象&#xff0c;private修饰的方法子类是访问不了的&#xff0c;且类中所有private修饰的方法都隐式的指定为final(可以对private方法添加final修饰词&#xff0c;但是这并不能给该方法增加任何额外的意义)&#xff0c;final修饰的方法是不可以被重写的。但是如…

Java,JavaFX的流畅设计风格进度栏

按照承诺&#xff0c;刚刚发布的Java JavaFX主题JMetro 4.6版为进度栏带来了新样式。 进度栏有两种可能的状态&#xff1a;确定和不确定&#xff0c;新的JMetro版本具有这两种状态。 在本文中&#xff0c;我还将详细介绍一些我在JMetro中遵守的API设计原则。 JMetro API设计原…

安卓最新系统_成纺移动校园(移动办公系统)V3.2.1 安卓最新版

成纺移动校园(移动办公系统)是额一个非常实用的办公工具。您可以使用该软件及时浏览最新的校园信息&#xff0c;同时涵盖许多功能&#xff0c;例如时间表查询&#xff0c;会议安排&#xff0c;校园地图&#xff0c;校车等。有需要的用户欢迎来绿色先锋网下载。 成纺移动校园简介…

java时间日期格式器_JAVA基础类库(二)-----日期、时间类和格式器

Date类public classDateTest{public static voidmain(String[] args){Date d1 newDate();//获取当前时间之后100ms的时间Date d2 new Date(System.currentTimeMillis() 10000);System.out.println(d1);System.out.println(d2);//比较d1,d2是否相等,相等返回0&#xff0c;大于…