文本批量替换的正则表达式

1、去掉第三世第十三世之类的前缀:
^(第)(w{1,})(世)($|W|s)

2、去掉行首名字加公的“公”字
^(w)(公,)

3、去掉某某公之子的“公”字
(Ww.?)(公)(w子W)
替换为:13

4、把“名字+字什么号什么+某某之子”调为“名字+某之子”的顺序
查找:(abcw.*W)(w.*W)(w.?公w子)(W)
替换为:13,2

5、去掉“名字+,+见后”
^(w{1,},)(见后)

6、替换适前后斜杠正则表达式
(/)(w{0,})(适)(w{0,})(/)
234

7、删掉见后无用记录行
^(w{1,})(,)(见后)(W|)

8、删除空行
^(s*)

9、提取某某子放名字后
^(w{1,2}W)(w.*)(W)(w{1,3}子,)
1423



文本内容为:
境界面(BOUNT)  
兴趣面(POINT)  
兴趣点(POIPT)  
交通线(TRALK)

其中“境界面”、“兴趣面”等中文部分为图层名称,BOUNT、POINT等英文部分为图层别名。
希望通过替换后的文本内容为:
*BOUNT,境界面,面  
*POINT,兴趣面,面  
*POIPT,兴趣点,点  
*TRALK,交通线,线  

即,将原来的“中文名(英文名)”的格式修改为“*英文名,中文名,图层类型”的格式,且图层类型来源为中文图层名的最后一个字。
使用的正则表达式为:
^(.+?)([点线面]{1})(([A-Z]+))
分组打包:
第一组:^(.+?)
第二组:([点线面]{1})
第三组:(([A-Z]+))

表达式说明:
    “^”匹配输入字符串的开始位置,即本例中的一整行文本;
    第一个括号中的内容“.+?”匹配除换行符“ ”之外的任意一个字符,如本例中的“境”部分;
    第二个括号中的内容匹配的是在“点、线、面”集合中的一个字符,如本例中的“面”;
    第三个括号中的内容匹配的是大写的A-Z字符部分。
    
被替换为:
3,12,2  
说明:$后跟序号N(如:$3),表示取到结果集中的第N条记录。其中第0条记录为完整的结果本身,第1条起为表达式括号中的内容。
调整组序:
3 公式得到的第三组内容调整到最前
12 公式得到的第一组内容和第二组内容其后
2 公式得到的第二组内容在最后
注意:3,和2, 后边的标点符号是在原文后加逗号。而原文中的()没有保留。


等价是等同于的意思,表示同样的功能,用不同符号来书写。

?,*,+,d,w 都是等价字符
  ?等价于匹配长度{0,1}
  *等价于匹配长度{0,}?
  +等价于匹配长度{1,}
  d等价于[0-9]

D等价于[^0-9]
  w等价于[A-Za-z_0-9]

W等价于[^A-Za-z_0-9]。

常用运算符与表达式:
  ^ 开始
  () 域段
  [] 包含,默认是一个字符长度
  [^] 不包含,默认是一个字符长度
  {n,m} 匹配长度?
  . 任何单个字符(. 字符点)
  | 或
   转义
  $ 结尾
  [A-Z] 26个大写字母
  [a-z] 26个小写字母
  [0-9] 0至9数字


我的手机 2018-02-07 16:29:13
常用运算符与表达式:
  ^ 开始
  () 域段
  [] 包含,默认是一个字符长度
  [^] 不包含,默认是一个字符长度
  {n,m} 匹配长度?
  . 任何单个字符(. 字符点)
  | 或
   转义
  $ 结尾
  [A-Z] 26个大写字母
  [a-z] 26个小写字母
  [0-9] 0至9数字

[A-Za-z0-9] 26个大写字母、26个小写字母和0至9数字
  , 分割
  .
  
  分割语法:
  [A,H,T,W] 包含A或H或T或W字母
  [a,h,t,w] 包含a或h或t或w字母
  [0,3,6,8] 包含0或3或6或8数字


  语法与释义:
  基础语法 "^([]{})([]{})([]{})$"
  正则字符串 = "开始([包含内容]{长度})([包含内容]{长度})([包含内容]{长度})结束"?
  
  ?,*,+,d,w 这些都是简写的,完全可以用[]和{}代替,在(?(?=)(?!)(?<=)(?<!)(?i)(*?)(+?)这种特殊组合情况下除外。
  初学者可以忽略?,*,+,d,w一些简写标示符,学会了基础使用再按表自己去等价替换


  
  实例:
  字符串;tel:086-0666-88810009999
  原始正则:"^tel:[0-9]{1,3}-[0][0-9]{2,3}-[0-9]{8,11}$"?
  速记理解:开始 "tel:普通文本"[0-9数字]{1至3位}"-普通文本"[0数字][0-9数字]{2至3位}"-普通文本"[0-9数字]{8至11位} 结束"
  等价简写后正则写法:"^tel:d{1,3}-[0]d{2,3}-d{8,11}$" ,简写语法不是所有语言都支持。

应用实例

【1】正则表达式应用——替换指定内容到行尾

原始文本如下面两行

abc aaaaa

123 abc 444

希望每次遇到“abc”,则替换“abc”以及其后到行尾的内容为“abc efg”

即上面的文本最终替换为:

abc efg

123 abc efg

解决:

① 在替换对话框,查找内容里输入“abc.*”,替换内容输入为“abc efg”
② 同时勾选“正则表达式”复选框,然后点击“全部替换”按钮
其中,符号的含义如下:
“.” =匹配任意字符
“*” =匹配0次或更多

注意:其实就是正则表达式替换,这里只是把一些曾经提出的问题加以整理,单纯从正则表达式本身来说,就可以引申出成千上万种特例。


正则表达式中的转义字符:通过“”作为前缀:
o          NUL字符(u0000)
            制表符(u0009)
            换行符(u000A)
v            垂直制表符(u000B)
f             换页符(u000C)
             回车符(u000D)
xnn        由十六进制数nn指定的拉丁字符
uxxxx     由十六进制xxxx指定的Unicode字符
cX          控制字符^X
实例:
function zyzf() {
            var text = "zy zf";
            var reg = new RegExp("\r", "g");
            alert(reg.test(text));
        }
<input id="Button9" type="button" value="转义字符匹配" onclick="zyzf()"  />

正则表达式中特殊标点符号:^ $  . * + ?= ! : | / ( ) [ ] { }(如果要在正则表达式使用这些直接量则要在前面加“”)
[^]:否定字符类,不包括在后面的匹配。
function tsbds()        {
            var text = "tieshubiaodianpipei";
            var reg = new RegExp("^ti", "g");
            alert(reg.exec(text));
        }
$:以什么的结尾。
. :除了换行符和unicode行终止符之外的所有字符。
[]:方括号里面的任意字符匹配。
例如:
var reg=new RegExp("[abc]","g");的含义和“a”“b”“c”中的任何一个匹配。

正则表达式中的字符类
w :任何ASCII字符组成的字母数字,等级于[a-zA-Z0-9]
W:任何不是ASCII字符组成的字母数字,等级于[^a-zA-Z0-9]
s :任何Unicode的空白字符
S: 任何非Unicode的空白字符
d: 任何ASCII数字,等价于[0-9]
D:出ASCII数字之外的任何字符,等价于[^0-9]
[]:退格直接量(特例)
实例:寻找字符串中的所以数字
function tsbds()        {
            var text = "ties2hubi3aodia2424npip242ei";
            var reg = new RegExp("\d", "g");
            alert(text.match(reg));
        }
<input id="Button10" type="button" value="特殊标点匹配" onclick="tsbds()"  />

正则表达式中重复用法:
{n,m}     匹配前一项至少n次,但是不超过m次
{n,}        匹配前一项n次或者更多次
{n}         匹配前一项n次
?          匹配前一项0次或者1次,等价于{0,1}
+           匹配前一项一次或者多次,等价于{1,}
*            匹配前一项0次或者多次,等价于{0,}
实例:找出数字组合
function tsbds()        {
            var text = "ties2hubi3aodia2424npip242ei";
            var reg = new RegExp("\d+", "g");
            alert(text.match(reg));
        }
<input id="Button10" type="button" value="特殊标点匹配" onclick="tsbds()"  />

正则表达式匹配之非贪婪的匹配,只需要在待匹配的字符后面跟一个问号即可。
如我们看看/a+?/的匹配结果吧。
function tsbds()        {            var text = "tieaaaas2hubi3aodia2424npip242ei";            var reg = new RegExp("a+?", "g");            alert(text.match(reg));        }
<input id="Button10" type="button" value="特殊标点匹配" onclick="tsbds()"  />

正则表达式之分组、选择和引用
|  分割供选择的字符,如/ab|cd|ef/可以匹配“ab”或“cd”或者“ef”(从左到右的匹配,左边匹配了就忽略右边的如/a|ab/遇到ab职匹配第一个)
()  将几个项组合成一个单元。
例如:
function tsbds()        {
            var text = "tiABCeaaaaSs2hubAi3aDodAia2424npBip24C2ei";
            var reg = new RegExp("ab|bc|de", "gi");
            alert(text.match(reg));
        }
<input id="Button10" type="button" value="特殊标点匹配" onclick="tsbds()"  />

正则表达式的修饰符
i   :执行不区分大小写的匹配
g  :找到所有的匹配
m :多行匹配模式
实例匹配所有的全局配置字母abc(不区分大小写)
function tsbds()        {
            var text = "tiABCeaaaaSs2hubAi3aDodAia2424npBip24C2ei";
            var reg = new RegExp("[abc]", "gi");
            alert(text.match(reg));
        }
<input id="Button10" type="button" value="特殊标点匹配" onclick="tsbds()"  />

例子:
原文是“礼火,字继定,高中,明月扶子,相平公之子,生于一八八二年正月十七日子时。娶杨某某长女,生于年月日子时。”
要求:
1、"娶...长女",改为“娶...女为妻”这种格式以避免调整第一种顺序时引起凡是...子|女,都移动到第二句的问题。


1的公式:
查找公式:(娶.+?女)W   //最小化筛选,不会把标点或“娶松门卫参军徽郡汪赞皇公女,生一女,”中的“汪赞皇公女,生一女”筛选进来。
                                       //后面加个参数W起判断标点作用,以防把“生一女”这样的内容也选中。
                  (娶.*女)(!?为妻)   //但遇到“娶松门卫参军徽郡汪赞皇公女,生一女,”会把“生一女”也包括进去。
替换公式:1为妻
执行结果:能够判断,看原句中有无为妻二字,如果没有则添加“为妻”二字,如已经有则不再重复添加。
                  会误选“娶朱氏,生于道光十三年卒失,续娶王氏生失,出二女”。

同理:AA,抚某某之子,某某继子,这二句有语法表达上的冲突。
公式:(抚.+?子)
替换:1入继
效果:AA,抚某某之子入继,某某之子

2、把“,相古公之子”调整到第二句,即:“礼火,相古公之子”
2的公式:字号后移,内容调序
例子内容:
小青,字清清,号木青,王老汉三女。适张村小李,出二女,长女待字次适谢。
小青,字清清,号木青,王老汉继女。适张村小李,出二女,长女待字次适谢。
小青,字清清,号木青,王老汉长女。适张村小李,出二女,长女待字次适谢。
小青,字清清,号木青,王老汉三女。适张村小李,出二女,长女待字次适谢。
小青,字清清,号木青,王老汉二女。适张村小李,出二女,长女待字次适谢。
小青,字清清,号木青,王老汉次女。适张村小李,出二女,长女待字次适谢。
小青,字清清,号木青,王老汉养女。适张村小李,出二女,长女待字次适谢。
查找公式:^(.+?W)(w.*)W(w*子|w*女)W
                 或:^(w.+?W)(w.*)W(w.*?子|w.*?女)W
替换公式:13,2,
小青,出二女,字清清,号木青,王老汉三女。适张村小李长女待字次适谢。
没有达到想要的目的。王老汉三女位置没动。
执行结果:能达到调整顺序目的,但会把以“子|女”结束的内容都调序到前边,如“娶..女,”,“字明子,”等
解决办法:
^(w.+?W)(.+?)(w+?子|w+?女)W
13,2
效果:
小青,王老汉三女,字清清,号木青,适张村小李,出二女,长女待字次适谢。
小青,王老汉继女,字清清,号木青,适张村小李,出二女,长女待字次适谢。
小青,王老汉长女,字清清,号木青,适张村小李,出二女,长女待字次适谢。
小青,王老汉三女,字清清,号木青,适张村小李,出二女,长女待字次适谢。
小青,王老汉二女,字清清,号木青,适张村小李,出二女,长女待字次适谢。
小青,王老汉次女,字清清,号木青,适张村小李,出二女,长女待字次适谢。
小青,王老汉养女,字清清,号木青,适张村小李,出二女,长女待字次适谢。

公式1在公式2之后执行。解决原文中"明月扶子,相古公之子,"子时等多个子或女信息时,也用这种方法。

对原文减少信息来测试一下(一个去掉字,一个去掉字和号):
小青,王老汉长女,字清清,适张村小李,出二女,长女待字次适谢。
小青,王老汉三女,字清清,号木青,适张村小李,出二女,长女待字次适谢。
小青,王老汉二女,适张村小李,出二女,长女待字次适谢。

结果:信息最少的那句王老汉的王字错位了。
小青,王老汉三女,号木青,适张村小李,出二女,长女待字次适谢。
小青,王老汉继女,字清清,适张村小李,出二女,长女待字次适谢。
小青,老汉长女,王适张村小李,出二女,长女待字次适谢。
小青,王老汉三女,字清清,号木青,适张村小李,出二女,长女待字次适谢。

去掉多余的“公”字
   查找公式:(Ww{1,2})(公)(.?[子|女])(W)
   替换公式:134
例子:
继平,相华公三子,字公然。
继直,守中公之子。继直公续娶赵家女为妻
堃信,守和公之女
不会替换“字公然”或“继直公续娶赵家女为妻”中的公字

</?(?!br|p|img|strong|/strong|div|table|tr|td|span)[^>]*>

去除word生成网页时产生的冗码
</?(?!/b|b|br|img|strong|/strong|div|table|tr|td)[^>]*>

^((?!我们).)*

^(d{1,2})(.)(s{1,2})
删除每行行首的数字序号编码的正则表达式,如:
1.        <style type="text/css">
2.        <!--
3.        #kw2 {font:13px Verdana; height:22px; 50px;}
4.        #sb {height:25px;5.6em}
5.        #bg{background-repeat:repeat-x}
6.        -->
7.        </style>

原文地址:https://www.cnblogs.com/yuanscn/p/10931917.html