1. 程式人生 > >Word中使用正則表示式進行查詢和替換(高效進行文書處理)

Word中使用正則表示式進行查詢和替換(高效進行文書處理)

術語

開始前,我們先定義一對術語:

  • 萬用字元指的是您可以用來代表一個或多個字元的鍵盤字元。例如,星號 (*) 通常代表一個或多個字元,問號 (?) 通常代表單個字元。
  • 對我們來說,正則表示式指的是您可以用來查詢和替換文字模式的文字字元和萬用字元組合。文字字元指的是必須存在於目標文字字串中的文字。萬用字元指的是目標字串中可能各不相同的文字。

試一試!

本節中的步驟介紹瞭如何使用正則表示式轉置姓名。請記住,始終使用“查詢和替換”對話方塊來執行您的正則表示式。同時請記住,如果表示式沒有按預期工作,你始終可以按下 CTRL + Z 來撤銷您的更改,然後嘗試其他表示式。

轉置姓名

  1. 啟動 Word,然後開啟一個新的空白文件。
  2. 複製此表格,將它貼上到該文件中。
Josh Barnhill
Doris Hartwig
Tamara Johnston
Daniel Shimshoni
  1. “開始”選項卡上的“編輯”組中,單擊“替換”以開啟“查詢和替換”對話方塊。
  2. 如果您沒有看到“使用萬用字元”複選框,請單擊“更多”,然後選中該複選框。如果您沒有選中該複選框,Word 會將萬用字元視作文字。
  3. “查詢內容”
    框中鍵入以下字元。請確保您在兩組括號之間包含了空格:

(<*>) (<*>)

  1. “替換為”框中,鍵入以下字元。請確保您在逗號和第二個斜槓之間包含了空格:

\2, \1

  1. 選擇該表格,然後單擊“全部替換”。Word 會轉置這些姓名並使用逗號分隔它們,如下所示:
Barnhill, Josh
Hartwig, Doris
Johnston, Tamara
Shimshoni, Daniel

 

正則表示式的工作原理

從此處開始,請記住這條原則:文件內容決定了您絕大多數(並非全部)正則表示式的設計。例如,在您之前使用的示例表格中,每個單元格都包含了兩個單詞。如果單元格包含兩個單詞和一箇中間名首寫字母,您將使用不同的表示式。

讓我們由內而外檢查每個表示式:

在第一個表示式 (<*>) (<*>) 中:

  • 星號 (*) 會返回單詞中的全部文字。
  • 小於和大於符號 (< >) 分別標記了每個單詞的開始和結束。它們確保搜尋會返回單個單詞。
  • 它們之間的括號和空格將單詞拆分成不同的組:(第一個單詞)(第二個單詞)。括號還指示了您希望搜尋以何種順序處理每個表示式。

換而言之,該表示式說:“查詢兩個單詞。”

在第二個表示式 \2, \1 中:

  • 斜槓 (\) 與數字放在一起充當佔位符。
  • 第一個佔位符後的逗號在兩個被轉置的姓名之間插入正確的標點符號。

換而言之,該表示式說:“寫入第二個單詞,新增逗號,寫入第一個單詞。”

要查詢和替換的專案的萬用字元

可以使用萬用字元搜尋文字。例如,可使用星號 (*) 萬用字元搜尋字串(例如,使用“s*d”將找到“sad”和“started”)。

使用萬用字元查詢和替換文字

  1. “開始”選項卡上的“編輯”組中,單擊“查詢”旁邊的箭頭,然後單擊“高階查詢”
  2. 選中“使用萬用字元”複選框。

如果看不到“使用萬用字元”複選框,請單擊“更多”

  1. 請執行下列操作之一:
  2. 若要從列表中選擇萬用字元,請單擊“特殊格式”,再單擊萬用字元,然後在“查詢內容”框中鍵入任何其他文字。在“查詢內容”框中直接鍵入萬用字元。
  3. 如果要替換該專案,請單擊“替換”選項卡,然後在“替換為”框中鍵入要用作替換的內容。
  4. 單擊“查詢下一處”“查詢全部”“替換”“全部替換”

若要取消正在執行的搜尋,請按 Esc。

可用的萬用字元

 註釋 

  • 選中“使用萬用字元”複選框後,Word 將只查詢與指定的內容精確匹配的文字。請注意,“區分大小寫”“全字匹配”複選框將不可用(灰顯),以表示這些選項已自動開啟。您無法關閉這些選項。
  • 若要搜尋已被定義為萬用字元的字元,請在該字元前面鍵入一個反斜槓 (\)。例如,鍵入 \? 來查詢問號。
  • 可使用括號對萬用字元和文字進行分組,以指明處理順序。例如,鍵入 <(pre)*(ed)> 可以找到“預排序的”和“已阻止的”。
  • 可使用 \n 萬用字元搜尋表示式,然後將其替換為經過重新排列的表示式。例如,在“查詢內容”框中鍵入 (Ashton) (Chris),並在“替換為”框中鍵入 \2 \1。Word 將找到 Ashton Chris 並將其替換為 Chris Ashton
用於查詢 型別 示例
任一字元 ? s?t 可找到“sat”和“set”。
任何字串 * s*d 可找到“sad”和“started”。
單詞開頭 < <(inter) 可找到“interesting”和“intercept”,但找不到“splintered”。
單詞結尾 > (in)> 可找到“in”和“within”,但找不到“interesting”。
指定字元之一 [ ] w[io]n 可找到“win”和“won”。
此範圍內的任一字元 [-] [r-t]ight 可找到“right”和“sight”。範圍必須是升序。
除了括號內範圍中的字元之外的任一字元 [!x-z] t[!a-m]ck 可找到“tock”和“tuck”,但找不到“tack”或“tick”。
前一個字元或表示式的 n 個匹配項 {n} fe{2}d 可找到“feed”,但找不到“fed”。
前一個字元或表示式的至少 n 個匹配項 {n,} fe{1,}d 可找到“fed”和“feed”。
前一個字元或表示式的 n 到 m 個匹配項 {n,m} 10{1,3} 可找到“10”、“100”和“1000”。
前一個字元或表示式的一個或多個匹配項 @ [email protected] 可找到“lot”和“loot”。

使用正則表示式

這些示例會向您展示一些在 Microsoft Word 中使用正則表示式的方法

示例 1:轉置帶中間名首寫字母的姓名

此示例使用萬用字元和字元程式碼組合來轉置包含中間名首寫字母的姓名。

在操作過程中,請記住下列事實:

  • 在對錶格中的姓名使用此表示式時,您必須首先將該表格轉換成文字。
  • 如果表格包含多個列,請將包含姓名的列複製到空白文件中,然後在那裡將它轉換成文字。
  • 轉置姓名後,請將文字重新轉換成表格。然後您可以刪除原始列並使用您已更改的資料 替換它。

準備示例資料

  1. 如果您還沒完成這一步,請啟動 Word 並建立一個新的空白文件。
  2. 將空白表格插入到該文件中。將表格設為寬一列高四行。
  3. 逐個複製這些姓名,並將每個姓名貼上到空白表格單元格中:

Joshua Quentin Barnhill
Doris X. Hartwig
Tamara Y. Johnston
Daniel Shimshoni

您的表格應如下所示:

Joshua Quentin Barnhill
Doris X. Hartwig
Tamara Y. Johnston
Daniel Shimshoni
  1. 選擇該表格,然後在“表格工具佈局”選項卡上的“資料”組中,單擊“轉換成文字”
  2. 選擇“段落標記”作為文字分隔符,然後單擊“確定”

轉置帶首寫字母的姓名

  1. “開始”選項卡上的“編輯”組中,單擊“替換”以開啟“查詢和替換”對話方塊。
  2. 選中“使用萬用字元”複選框(您可能需要單擊“更多”以檢視該複選框),然後在“查詢內容”框中鍵入以下表達式:

(*) ([! ]@)^13

請確保在兩組括號之間和感嘆號之後輸入空格。如果您之前沒有看到 ^13 字元,我們會在下一節介紹它的作用。

  1. “替換為”框中,鍵入以下表達式:

\2, \1^p

  1. 選擇姓名列表,然後單擊“全部替換”。Word 會轉置這些姓名以及中間名首寫字母或中間名,如下所示:

Barnhill,Joshua Quentin
Hartwig,Doris X.
Johnston,Tamara Y.
Shimshoni,Daniel

將已更改的文字重新轉換為表格

  1. 請選擇已轉置的姓名列表。
  2. “插入”選項卡上的“表格”組中,單擊“表格”,然後單擊“將文字轉換成表格”

會開啟“將文字轉換成表格”對話方塊。

  1. “文字分隔位置”下,單擊“段落”,然後單擊“確定”

逐個查看錶達式

讓我們從“查詢內容”框中的表示式開始,逐個檢視這些表示式,從而瞭解它們是如何工作的。

整個表示式會查詢兩組模式:一個帶有中間名首寫字母(或中間名)的名和一個姓。(*) 會查詢全部名。請注意,它後面有一個空格。

表示式的此部分與姓相匹配:

([! ]@)^13

感嘆號會排除括號中指定的任何字元。在此案例中,[! ] 代表“查詢除空格外的全部資訊”。它的作用是從姓前面剪裁掉空格。

@ 字元會查詢前一個字元的一個或多個匹配項,因此,它的作用是確保刪除姓前面的全部空格。

我們需要知道姓的結尾處,因此我們還使用 ^13 字元來搜尋每一行結尾處的段落標記。但是,由於我們不準備重新使用該段落標記,所以我們會用括號將所有其他的內容括起來。

您可以通過以下步驟來嘗試這一操作:將姓名再次複製到您的測試文件中(請確保使用段落標記分隔它們),然後使用 ([! ]@)^13 在“查詢內容”框中進行搜尋。搜尋會與每個姓相匹配。

因為搜尋會在下一行的起始處重新開始,所以我們使用星號萬用字元 (*) 來匹配此處到下一個姓的起始處之間的全部內容。

由於我們不準備在姓前面重新使用空格,我們使用括號來將它從兩組中排除:

(*) ([! ]@)^13

 要點   請謹慎使用 ^13 字元程式碼。通常,您可以 ^p 字元程式碼來搜尋段落標記。但是,無法在萬用字元搜尋中使用該程式碼。您需要替換為使用程式碼 ^13。儘管無法在萬用字元搜尋中使用 ^p 字元程式碼,您應當在萬用字元替換操作中使用它。這是為什麼? ^p 字元包含了格式資訊,^13 字元則沒有。此外,您完全無法將樣式資訊分配給 ^13 字元。在替換操作中錯誤使用 ^13 程式碼會在實質上將您的文件轉換成無法設定格式的檔案。

“替換”表示式 (\2 \1) 會完成實際轉置。在“替換為”框中,\2 字元讓搜尋首先寫入第二個模式,然後在該模式後新增逗號。\1^p 字元指定了寫入第一個模式的位置並讓搜尋在該模式後寫入段落標記。

示例 2:轉置日期

您可以使用此處顯示的正則表示式來將歐洲格式的日期轉換為美國格式的日期。

轉置日期

  1. 複製以下日期並貼上到您的文件中:28th May 2003
  2. 開啟“查詢和替換”對話方塊,然後在“查詢內容”框中鍵入以下表達式:

([0-9]{1,2})([dhnrst]{2}) (<[ADFJMNOS]*>) ([0-9]{4})

請確保在以下左括號和右括號之間插入空格: 2}) (<[ and *>) ([0.

  1. “替換為”框中輸入以下表達式:

\3 \1, \4

請確保在每個字符集之間插入空格。

  1. 單擊“全部替換”

搜尋會將 28th May, 2003 替換為 May 28, 2003。

逐個查看錶達式

讓我們從“查詢內容”框中的表示式開始。該表示式的作用是將日期分解為四個部分,由多組括號來表示。每個模式都包含您在全部日期(以您在示例中使用的樣式書寫)中查詢的元件。按從左到右的順序:

  • 數字範圍 [0-9] 匹配第一個模式中的一位數數字。因為日期可以由兩個數字組成,我們讓搜尋返回一位數或兩位數的日期:{1,2}。結果為第一個模式:([0-9]{1,2})

序數片語成了第二個模式。序數詞包含“th”、“nd”、“st”和“rd”,因此我們將這些字母新增到範圍 [dhnrst] 中。因為序數詞總是由兩個字母組成,我們將字母計數限制為 2:([dhnrst]{2})

  • 接下來是空格,之後是查詢月份名的文字字元和萬用字元。所有月份名都以這些大寫字母開頭:ADFJMNOS。我們不知道每個大寫字母后有多少個字元,因此我們在它們之後使用星號 (*)。我們只對月份名本身感興趣,因此我們使用大於和小於字元來將結果限制為單個單詞。結果為第四個模式:(<[ADFJMNOS]*>)
  • 最後,我們搜尋年。我們使用相同的數字範圍,但這次我們將計數限制為四個字元 ([0-9]{4})

請注意,我們在“替換為”框中只寫入四個地址模式中的三個。我們從日期中省略了序數詞 ("th"),因為美國格式的日期 不使用序數詞。如果您想在日期中保留序數詞,請在“替換為”框中輸入 \3 \1\2, \4。在本例中,您在 3 和逗號之後都輸入了空格,其他地方則沒有。

此時,您可能要問:如何處理沒有拼寫月份名的日期?例如, 28/05/03。使用此表示式搜尋:

([0-9]{1,2})/([0-9]{1,2})/([0-9]{2})

使用此表示式替換:

\3/\1/\2

如果日期使用的格式為 28/05/2003,則在最後一個模式中使用 {4},而非 {2}

關於在正則表示式中使用列表分隔符

上面的例子使用以下引數來查詢一位數或兩位數日期:{1,2}。在本例中,逗號將兩個值分隔開。但是請記住,您在 Windows 中的區域設定會控制您使用的列表分隔符。如果您的區域設定將分號的使用指定為列表分隔符,則您必須使用分號,而非逗號。

 

示例 3:向稱呼新增句號,或從稱呼刪除句號

在某些國家,尊稱(Mr.、Mrs. 等)不包括句號。此示例為您展示瞭如何向尊稱新增句號,或從尊稱刪除句號。從現在開始,我們假定您知道如何使用“查詢和替換”對話方塊。

此表示式會查詢沒有句號的 Mr、Ms、Mrs 和 Dr:

<([DM][rs]{1,2})( )

請注意,表示式會使用另一個包含空格的模型。該空格將緊隨尊稱之後(如果那裡沒有句號)。此表示式會新增句號:

\1.\2

要反向操作,請使用此表示式進行搜尋:

<([DM][rs]{1,2})。

使用此表示式進行替換:

\1

示例 4:查詢重複段落或行

在使用此表示式時,您可能希望首先對列表排序,以便將重複行相鄰放置。同樣的,您需要刪除全部空白段落標記。換言之,如果您使用空白段落來分隔文字塊,如下所示:

Joshua Quentin Barnhill¶

Joshua Quentin Barnhill¶

Doris X. Hartwig¶

您需要刪除那些段落,如下所示:

Joshua Quentin Barnhill¶
Joshua Quentin Barnhill¶
Doris X. Hartwig¶

您可以用自己喜歡的方法來刪除空白段落,但是,我們正在談論正則表示式,因此這裡就有一個能夠查詢兩個連續段落字元的方法。使用此表示式進行搜尋(@ 字元會重複查詢和替換操作並刪除全部多個空行):

(^13)\[email protected]

使用此表示式替換結果:

^p

現在,我們來看看替換文字的方法。此表示式會查詢兩個連續相同段落的任意序列:

(*^13)\1

此表示式還會匹配在段落中結束的較長文字重複項。例如,對以下列表執行該表示式:

Joshua Quentin Barnhill¶
Doris X. Hartwig¶
Joshua Quentin Barnhill¶
Doris X. Hartwig¶
Tamara Y. Johnston¶

搜尋會查詢前四行,只有當總體模式更改時才會停止。與之相反,如果您對此列表執行該表示式:

Joshua Quentin Barnhill¶
Joshua Quentin Barnhill
Doris X. Hartwig¶
Doris X. Hartwig¶

表示式會只查詢前兩個段落。 

要搜尋更多的相同專案,請新增更多佔位符。例如,此表示式會查詢三個連續相同段落:

(*^13)\1\1

您還可以使用大括號來達到同樣的目的。以下示例會分別查詢兩個和三個相同段落:

(*^13){2}
(*^13){3}

或者,您可以查詢兩個或三個相同段落:

(*^13){2,3}

您還可以查詢兩個或更多相同段落:

(*^13){2,}

可以使用以下字串替換這些表示式中的任意一個:

\1

此外,您可以在必要時重複查詢和替換操作,以便替換您文件中的全部重複段落,或者您可以新增 @ 萬用字元,讓表示式為您重複該操作:

(*^13)\[email protected]

您還可以使用此方法來替換表格中的重複行。要做到這一點,請首先刪除合併的單元格,然後為表格排序以相鄰放置重複單元格。接著,請將您的表格轉換成文字。(在“表格”選單上,指向“轉換”,然後單擊“表格到文字”;出現提示時,使用製表符分隔符。)完成替換後,請將文字重新轉換成表格。