文本批量替換的正則表達式


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

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

3、去掉某某公之子的“公”字
(\W\w.?)(公)(\w子\W)
替換為:\1\3

4、把“名字+字什么號什么+某某之子”調為“名字+某之子”的順序
查找:(abc\w.*\W)(\w.*\W)(\w.?公\w子)(\W)
替換為:\1\3,\2

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

6、替換適前后斜杠正則表達式
(/)(\w{0,})(適)(\w{0,})(/)
\2\3\4

7、刪掉見后無用記錄行
^(\w{1,})(,)(見后)(\W|)

8、刪除空行
^(\s*)\r\n

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



文本內容為:
境界面(BOUNT)  
興趣面(POINT)  
興趣點(POIPT)  
交通線(TRALK)

其中“境界面”、“興趣面”等中文部分為圖層名稱,BOUNT、POINT等英文部分為圖層別名。
希望通過替換后的文本內容為:
*BOUNT,境界面,面  
*POINT,興趣面,面  
*POIPT,興趣點,點  
*TRALK,交通線,線  

即,將原來的“中文名(英文名)”的格式修改為“*英文名,中文名,圖層類型”的格式,且圖層類型來源為中文圖層名的最后一個字。
使用的正則表達式為:
^(.+?)([點線面]{1})(([A-Z]+))
分組打包:
第一組:^(.+?)
第二組:([點線面]{1})
第三組:(([A-Z]+))

表達式說明:
    “^”匹配輸入字符串的開始位置,即本例中的一整行文本;
    第一個括號中的內容“.+?”匹配除換行符“\n”之外的任意一個字符,如本例中的“境”部分;
    第二個括號中的內容匹配的是在“點、線、面”集合中的一個字符,如本例中的“面”;
    第三個括號中的內容匹配的是大寫的A-Z字符部分。
    
被替換為:
\3,\1\2,\2  
說明:$后跟序號N(如:$3),表示取到結果集中的第N條記錄。其中第0條記錄為完整的結果本身,第1條起為表達式括號中的內容。
調整組序:
\3 公式得到的第三組內容調整到最前
\1\2 公式得到的第一組內容和第二組內容其后
\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)
\t            制表符(\u0009)
\n            換行符(\u000A)
\v            垂直制表符(\u000B)
\f             換頁符(\u000C)
\r             回車符(\u000D)
\xnn        由十六進制數nn指定的拉丁字符
\uxxxx     由十六進制xxxx指定的Unicode字符
\cX          控制字符^X
實例:
function zyzf() {
            var text = "zy\t\rzf";
            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]
[\b]:退格直接量(特例)
實例:尋找字符串中的所以數字
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起判斷標點作用,以防把“生一女”這樣的內容也選中。
                  (\b娶.*女)(!?為妻)   //但遇到“娶松門衛參軍徽郡汪贊皇公女,生一女,”會把“生一女”也包括進去。
替換公式:\1為妻
執行結果:能夠判斷,看原句中有無為妻二字,如果沒有則添加“為妻”二字,如已經有則不再重復添加。
                  會誤選“娶朱氏,生於道光十三年卒失,續娶王氏生失,出二女”。

同理:AA,撫某某之子,某某繼子,這二句有語法表達上的沖突。
公式:(撫.+?子)
替換:\1入繼
效果:AA,撫某某之子入繼,某某之子

2、把“,相古公之子”調整到第二句,即:“禮火,相古公之子”
2的公式:字號后移,內容調序
例子內容:
小青,字清清,號木青,王老漢三女。適張村小李,出二女,長女待字次適謝。
小青,字清清,號木青,王老漢繼女。適張村小李,出二女,長女待字次適謝。
小青,字清清,號木青,王老漢長女。適張村小李,出二女,長女待字次適謝。
小青,字清清,號木青,王老漢三女。適張村小李,出二女,長女待字次適謝。
小青,字清清,號木青,王老漢二女。適張村小李,出二女,長女待字次適謝。
小青,字清清,號木青,王老漢次女。適張村小李,出二女,長女待字次適謝。
小青,字清清,號木青,王老漢養女。適張村小李,出二女,長女待字次適謝。
查找公式:^(\b.+?\W)(\w.*)\W(\w*子|\w*女)\W
                 或:^(\w.+?\W)(\w.*)\W(\w.*?子|\w.*?女)\W
替換公式:\1\3,\2,
小青,出二女,字清清,號木青,王老漢三女。適張村小李長女待字次適謝。
沒有達到想要的目的。王老漢三女位置沒動。
執行結果:能達到調整順序目的,但會把以“子|女”結束的內容都調序到前邊,如“娶..女,”,“字明子,”等
解決辦法:
^(\w.+?\W)(.+?)(\w+?子|\w+?女)\W
\1\3,\2
效果:
小青,王老漢三女,字清清,號木青,適張村小李,出二女,長女待字次適謝。
小青,王老漢繼女,字清清,號木青,適張村小李,出二女,長女待字次適謝。
小青,王老漢長女,字清清,號木青,適張村小李,出二女,長女待字次適謝。
小青,王老漢三女,字清清,號木青,適張村小李,出二女,長女待字次適謝。
小青,王老漢二女,字清清,號木青,適張村小李,出二女,長女待字次適謝。
小青,王老漢次女,字清清,號木青,適張村小李,出二女,長女待字次適謝。
小青,王老漢養女,字清清,號木青,適張村小李,出二女,長女待字次適謝。

公式1在公式2之后執行。解決原文中"明月扶子,相古公之子,"子時等多個子或女信息時,也用這種方法。

對原文減少信息來測試一下(一個去掉字,一個去掉字和號):
小青,王老漢長女,字清清,適張村小李,出二女,長女待字次適謝。
小青,王老漢三女,字清清,號木青,適張村小李,出二女,長女待字次適謝。
小青,王老漢二女,適張村小李,出二女,長女待字次適謝。

結果:信息最少的那句王老漢的王字錯位了。
小青,王老漢三女,號木青,適張村小李,出二女,長女待字次適謝。
小青,王老漢繼女,字清清,適張村小李,出二女,長女待字次適謝。
小青,老漢長女,王適張村小李,出二女,長女待字次適謝。
小青,王老漢三女,字清清,號木青,適張村小李,出二女,長女待字次適謝。

 

 

去掉多余的“公”字
   查找公式:(\W\w{1,2})(公)(.?[子|女])(\W)
   替換公式:\1\3\4
例子:
繼平,相華公三子,字公然。
繼直,守中公之子。繼直公續娶趙家女為妻
堃信,守和公之女
不會替換“字公然”或“繼直公續娶趙家女為妻”中的公字

 

 

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

去除word生成網頁時產生的冗碼
<\/?(?!/b|b|br|img|strong|\/strong|div|table|tr|td)[^>]*>

 

^((?!我們).)*\n

 

^(\d{1,2})(.)(\s{1,2})
刪除每行行首的數字序號編碼的正則表達式,如:
1.        <style type="text/css">
2.        <!--
3.        #kw2 {font:13px Verdana; height:22px; width:50px;}
4.        #sb {height:25px;width:5.6em}
5.        #bg{background-repeat:repeat-x}
6.        -->
7.        </style>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM