zoukankan      html  css  js  c++  java
  • 文本批量替换的正则表达式

    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>

  • 相关阅读:
    tar命令详解
    保存GNOME桌面环境中声卡的音量设置
    SyntaxError: NonASCII character ‘\xe5′ in file
    Python小练习采集天气预报
    Debian编译内核教程
    Debian软件包依赖关系图
    mysql unauthenticated user原因分析以及解决方法
    Struts2 配置
    Map基本操作
    Iterator迭代器
  • 原文地址:https://www.cnblogs.com/yuanscn/p/10931917.html
Copyright © 2011-2022 走看看