文档章节

不会的增则

Rezeroer
 Rezeroer
发布于 2015/03/27 11:25
字数 753
阅读 79
收藏 0

cat或者cut的情况,正则表达式写做『c[au]t』

uharonducour。 正则表达式为『c(u|har|onduc|our)t』

如果要匹配的单词是 c开头、t结尾,中间有一个字符,但不能是u(也就是说,整个单词不能是cut),直接用『c[^u]t』

我们回头仔细看看这个“非”的逻辑,我们发现,其实我们要否定的是“单个出现的a或u”,而不仅仅是“出现的a或u”,所以才出现这样的问题,要解决这个问题,就应当把意思准确表达出来,变成“在结尾的t之前,不容许只出现一个a或u”。想到这一步,我们就可以用否定顺序环视『(?!…)』来解决了,它表示“在这个位置向右,不容许出现子表达式能够匹配的文本,我们把子表达式规定为『[au]t\b』(最后的『\b』很重要,它出现在t之后,保证t是单词的结尾子母)。

有了这点限制,匹配a和t之间文本的表达式就随意很多了,我们可以用匹配单词字符的简记法『\w』表示,于是整个表达式就变成了『c(?![au]t\b)\w+t』。请注意,这里出现的并不是排除型字符组『[^au]』,而是普通的字符组『[au]』,因为否定顺序环视『(?!…)』本身已经表示了“否定”的功能。

如果我们再进一步,“整个匹配文本中都不能出现字符串cat”,要怎么办呢?许多人的思路就是借鉴处理“或”关系的思路:既然字符组对应单个字符的情况,多选分支对应多个字符的情况,那么在否定时也是这样。可惜,正则表达式并没有提供与多选分支对应的“否定”结构,那么,应该怎么办呢?

解决的办法还是得依靠否定顺序环视——“整个匹配文本中都不能出现字符串cat”,换句话说,就是“在文本中的任意位置,向右,都不能出现该字符串”。因此,我们用两个锚点『^』和『$』,分别匹配整个字符串的开头和结尾位置,再用否定顺序环视『(?!cat)』表达“不能出现字符串cat”。

即便知道了原理,也不见得能写对正则表达式,比如『^(?!cat).+$』就是不正确的,因为它只限定了在文本的开头(也就是『^』)右边不能出现cat,而我们真正要做的是,在文本的每一个位置右边,都不能出现cat,所以应该改成『^((?!cat).)+$』;但这还说不上完美,根据前面提到的关于括号捕获的知识,因为此处并不需要括号捕获的文本,所以最好使用非捕获型括号『(?:…)』,最终我们得到的表达式就是『^(?:(?!cat).)+$』。

匹配多行

(?ms)


© 著作权归作者所有

共有 人打赏支持
Rezeroer

Rezeroer

粉丝 54
博文 72
码字总数 22354
作品 0
海淀
程序员
关于Java自增操作的原子性分析

刚接触编程的时候写的是C/C++,转java后,一直都认为java自增操作是原子性的操作,昨天看到一篇关于ArrayList多线程不安全的文章,里边有个Demo,发现新增操作(add)次数和List的size怎么也...

守望者-圣堂刺客
2016/04/24
174
0
volatile保证原子性吗?

参考网页 https://www.cnblogs.com/dolphin0520/p/3920373.html#!comments JDK版本--代码中打印了jdk的版本 1.7.0_79 例子代码--Test.java 运行结果--多次运行 运行结果1 1.7.0_79 ---9836 ...

karma123
08/29
0
0
C++知识点积累(2)

1 如果出于某些原因,需要在const成员函数中修改某一个或几个成员,那么可以将需要修改的成员声明为mutable,例如 2 如果一个类没有显式声明构造函数,拷贝构造函数,赋值运算符,析构函数,...

smartstone_2015
2016/04/22
62
0
spring boot使用通用mapper(tk.mapper) ,id自增和回显等问题

最近项目使用到tk.mapper设置id自增,数据库是mysql。在使用通用mapper主键生成过程中有一些问题,在总结一下。 1、UUID生成方式-字符串主键 在主键上增加注解

北岩
07/19
0
0
MySQL 自增主键和UUID

关于自增主键和UUID的比较,可以从数据插入前,插入中,插入三个阶段进行比较,他们有各自的有点,当然也有各自的不足。下面就分三个阶段说说优缺点。 插入前 1)UUID 需要手动维护,要求是保...

learn_more
2016/12/16
95
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringData JPA 在解析实体类字段时驼峰自动添加下划线问题

SpringData JPA 使用的默认命名策略是: ImprovedNamingStrategy 。用下划线转换驼峰名,如 authorId ,转换成 author_id 。这样就遇到了一个问题:实体中驼峰命名的列名转换成下划线后,在M...

Jacktanger
4分钟前
0
0
Android JNI开发系列(十)JNI访问 Java 实例变量和静态变量

JNI访问 Java 实例变量和静态变量 Java 中的实例变量和静态变量,在本地代码中如何来访问和修改。静态变量也称为类变量(属性),在所有实例对象中共享同一份数据,可以直接通过类名.变量名来...

蔡小鹏
8分钟前
0
0
jsapi4加载的首个图层的范围被默认作为地图范围,且不能修改的解决

在map加载的第一个图层的图层范围(fullExtent),会被默认设置为map的全图范围,且不能更改,从一般地图控件角度来说,应该有fullExtent属性,作为地图的全图范围,但很遗憾jsapi4.9还没有 ...

canneljls
9分钟前
0
0
JSON.stringify()

JSON.parse()与JSON.stringify()的区别 JSON.parse()【从一个字符串中解析出json对象】 例子: //定义一个字符串 var data='{"name":"goatling"}' //解析对象 JSON.parse(data) 结果是: na...

废柴
9分钟前
0
0
HashSet

前言 Set的实现类都是基于Map来实现的(HashSet是通过HashMap实现的)。 构造图如下: 蓝色线条:继承 绿色线条:接口实现 正文 对于HashSet而言,它是基于HashMap来实现的,底层采用HashMap来保...

狼王黄师傅
11分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部