正则表达式:难但有用
本帖最后由 马黑黑 于 2021-8-26 21:33 编辑文字表达总有一定的规律性。有时候,看似没有规律性的文字群,其实也有规律——规律在你心中。怎么讲?
一封菇凉的来信,你最想看到的是什么?对你仰慕还是敬爱之情呢,还是对你爱慕之心?你想检索重要的信息,就是关键字词或暗示性的语句流?还是某一个特殊的引用?
没关系,通过正则表达式,你可以检索到(或者没能检索到——因为没有)你所设定的东东,并且,它建立起来的搜寻方式,比你想象的要好的多。比方说你的情敌可能是Kart和Mark,在她长篇大论的描述性信文里,到底提没提到过他们?请构建一个正则表达式来查找两个“情敌”的名字:
\b{1}ar{1}\b
在 EmEditor 里,启用了区分大小写之后,查找的效果如下图所示:
讲解一下我们建立的正则表达式的构成:
一、头尾 \b ... \b :表示一个单词的开头和结束;
二、{1} :表示 M 和 K 任意一个只要出现一次,也只能出现一次。{1}同理;
三、ar :和你平时在word和Excel里查找的东东一个样。
好,看似复杂,但复杂的背后只是约定(语法),熟悉后就不会觉得不可接受。它的好处是,比你简单地查找 Mark 和 Kart 强,它可以一次找两个。
这个查找也可以找到一处以后继续查找下一处么? 二、{1} :表示 M 和 K 任意一个只要出现一次,也只能出现一次。{1}同理;
这句没怎么懂,是遇到带M的就找到?那样会不会误找?
为什么不是Mark四个字母,而是两个?
老黑这个也太专业了啊!{:4_203:} 加林森 发表于 2021-8-26 21:51
老黑这个也太专业了啊!
哪里哪里 马黑黑 发表于 2021-8-26 22:33
哪里哪里
{:5_153:}{:5_153:} https://p0.ssl.qhmsg.com/t0115aff2af0fa554b7.gif
你们看着,我先撤了!
红影 发表于 2021-8-26 21:50
二、{1} :表示 M 和 K 任意一个只要出现一次,也只能出现一次。{1}同理;
这句没怎么懂,是遇到 ...
,是备选字符集合,这个集合有两个,M和K,它们两个中只要有一个出现,就判为符合条件;其后的{1}用于限定出现的次数,1表示出现1次。
Mark里有M,Kart里有K,这两个单词因此符合 {1} 的规定,这叫匹配,因此它们都将会被检索出来。但要完整选择这两个单词,还需要有其他规范:
{1}与前述的结构同理,不一样的地方是它规定的是单词末尾的字母(前者规定的是头字母)。\b ... \b 就是这个意思,前一个表示单词开头处,后一个表示单词结尾处:\b{1}ar{1}\b
这样就等于告诉查找系统:我要查找这样的单词,它们以 M 或 K 开头,中间是 ar,最后一个字母要么是 k 要么是 t,通通给我找出来。 红影 发表于 2021-8-26 21:47
这个查找也可以找到一处以后继续查找下一处么?
图示已表明,它找的是全部匹配的单词,亦即,只要是 Mark 和 Kart,它全给找出来。
当输入光标回到编辑页面,请将光标移到文档最开头处,然后按 F3 查找下一个,EmEditor会依次按顺序为你提供匹配的文字。 实用至上:看下面的东东,我们只要保留网址,其他乱七八糟的内容全部清除掉——
先找规律:上面内容还是有规律的,乱字符+网址,乱字符都在网址之前。
接着构建一个正则表达式:
^.*(http)
它分三个部分:
① ^ : 行首
② .* : 一切字符
③ (http) :括号是替换时我们要引用保留的子表达式,http 当然要保留。
上图是替换页面。之前我在查找页面点了选择全部,检查正则表达式写的对不对,体现在编辑框正文里,显然没问题,可以切换到替换窗口来。注意上图中的“替换为”处,我填写了 \1,它表达的意思是,向查找表达式中引用第一个(从左向右数)子表达式,也就是括号部分的 http,上面说到这个要留下来。
强调:查找的表达式里,用括号括起来的部分叫子表达式,按从左向右的规范数其序号,\1是第一个,\2是第二个,以此类推。如果引用整个表达式则用 \0,不论有括号与否。
点替换全部按钮,效果如图三所示,是不是很清爽?
马黑黑 发表于 2021-8-27 07:00
,是备选字符集合,这个集合有两个,M和K,它们两个中只要有一个出现,就判为符合条件;其后的{1}用 ...
嗯嗯,明白了{:4_187:} 马黑黑 发表于 2021-8-27 07:27
实用至上:看下面的东东,我们只要保留网址,其他乱七八糟的内容全部清除掉——
这个倒是很实用呢{:4_199:} 厉害厉害{:4_199:} 加林森 发表于 2021-8-27 17:48
厉害厉害
队长更厉害 红影 发表于 2021-8-27 15:27
这个倒是很实用呢
Word也能做到。但在替换方面,对正则的支持度不行 本帖最后由 马黑黑 于 2021-8-28 10:23 编辑
两个汉字的全拼,最多可能有多少个字母?
最多字母的声母是两个 2
最多字母的韵母是四个 4
那么,两个汉字的全拼码,最多有 2*6=12 个字母。
我要构建一个正则表达式,找出两分法最长码的字。我已对每个单字的码表做了全拼分割,有 ' 做标记,所以我要找的是 13 个字符的拼音码。以下是我构建的正则表达式:
\t.{13}$
上面式子分三个部分:
\t :一个制表符,即在文本编辑器中按 Tab键 所得的符号
.{13} :. 表示换行符以外的所有字符,它后面跟着一个 {13} 限制符,表示 . 代表的字符出现 13 次
$ :换行符(这个其实不要也行,我是为了万无一失)
效果如下:
就它一个:叕,又双叒叕序列里的字,读 zhuo 二声 ,叒读 ruo 四声
马黑黑 发表于 2021-8-28 09:42
Word也能做到。但在替换方面,对正则的支持度不行
哦哦,这个规则应用还挺广的。头一次知道这个正则。学习了。{:4_204:} 马黑黑 发表于 2021-8-28 09:42
队长更厉害
我一般般,你这个可是很专业的哦。 加林森 发表于 2021-8-28 14:16
我一般般,你这个可是很专业的哦。
差不多差不多 红影 发表于 2021-8-28 12:43
哦哦,这个规则应用还挺广的。头一次知道这个正则。学习了。
正则表达式令人头疼的,但使用它能做太多的事情