正規表示式替換和不包含指定字串

2022-07-04 08:45:12 字數 3207 閱讀 4919

展示一段文字,段落中有些特殊標記的人名、刊名等,格式大體是:「(作者《刊名》其他)」,某個字段可以為空,比如作者為空。

那麼對應的正則大體是這樣的   '\((.*?)《(.*?)》.*?\)'   

最終的效果是 「(作者《刊名》其他)」

1

class

program2"

, author));19}

20if (bookname + "" != "")21

", bookname));23}

24}25console.writeline(str);26}

27 }

這裡使用了命名分組的匹配方式,之前有一篇寫過相關東西,點選正規表示式分組小記檢視

static

string pattern = @"

\((?[^<>]*?)《(?[^<>]*?)》.*?\)

";

獲取作者、刊名資訊時,排除標籤(『<』和『>』),效果還是可以的。

[例]當夫廣州之首難,武漢興師,革命精神,震鑠一世。(《東方雜誌

》2023年第9卷第1號)|欲去此不平等與壓制,繼政治革命而謀社會革命者,社會主義是也。(

《青年雜誌

》2023年第1卷第1號)|俄、德等國的勞工社會,首先看破他們

的野心,不惜在大戰的時候,起了社會革命,防遏這資本家**的戰爭。(

李大釗《庶民的勝利

》2023年)|近年來文學革命的運動漸見功效,除了幾個

講「綱常名教」的經學家。(

周作人《思想革命》

1919

年)[按] 「革命」本指實施變革以應天命。「革命」現在經常指各個領域的新的改

革,推動事物發生根本變革,引起事物從舊質變為新質的飛躍。

當然沒必要這樣一次次迴圈替換,因為正規表示式替換可以一次幫你搞定。

至於這樣做的目的,可以把不符合該正規表示式的作者名或者書名的內容一起替換為鏈結。而且最重要的是,可以針對每一次匹配值,可以做不同的處理。

比如通過匹配的作者或者書名再去資料庫查詢匹配的作者(或書名)的介紹(或者id),然後新增到a標籤的鏈結內(例如這裡的鏈結是東方雜誌的id'>東方雜誌)

再比如為空的匹配組,我們可以跳過不進行替換,下邊的正規表示式替換版本,便無法做到這點了。

1

class

program

212 }

最後的效果如下,也還不錯。

[例]當夫廣州之首難,武漢興師,革命精神,震鑠一世。(

《東方雜誌》2023年第9卷第1號)|欲去此不平等與壓制,繼政治革命而謀社會革命者,

社會主義是也。(

《青年雜誌

》2023年第1卷第1號)|俄

、德等國的勞工社會,首先看破他們的野心,不惜在大戰的時候,起了社會革命,防遏這資本家

**的戰爭。(

李大釗《庶民的勝利

》2023年)|近年來

文學革命的運動漸見功效,除了幾個講「綱常名教」的經學家。(

周作人《

思想革命》2023年)

[按] 「革命」本指實施變革以應天命。「革

命」現在經常指各個領域的新的改革,推動事物發生根本變革,引起事物從舊質變為新質的飛

躍。

這裡用到了$n的東東,也是現查現用。

我理解的很簡單,正則中使用了分組,而$n就是對應每個分組的匹配值,$0是整個正則匹配的結果,$1$2……是每個分組按前後順序的匹配結果。

結果中標藍的內容印證了為空匹配組也被替換的結果。

到目前為止,我們的程式沒啥問題,但是資料是變化。看下邊這個例項

1

class

program212

13 }

結果如下

[例]當夫廣州之首難,武漢興師,革命精神,震鑠一世。('

#'>《'

#'>東方雜誌》2023年第9卷第1號)|欲去此不平等與壓制,繼政治革命而謀社會革命者,

社會主義是也。('

#'>《'

#'>青年雜誌

》2023年第1卷第1號)|俄

、德等國的勞工社會,首先看破他們的野心,不惜在大戰的時候,起了社會革命,防遏這資本家

**的戰爭。(李大釗《庶民的

勝利》2023年)|近年來文學革

命的運動漸見功效,除了幾個講「綱常名教」的經學家。('#

'>周作人《f='#

'>思想革命》2023年)

[按] 「革命」本指實施變革以應天命。「革命」現

在經常指各個領域的新的改革,推動事物發生根本變革,引起事物從舊質變為新質的飛躍。

>

標紅的部分沒有加上鏈結,當然看我們的正則,就會知道因為包含'<'和'>'標籤,所以匹配失敗了。

修改我們的正則,只排出a標籤即可,如下

static

string pattern = @"

\((?(?!.*?<\s*a).*?)《(?(?!.*?<\s*a).*?)》(?.*?)\)

";

這個正則(author和bookname分組)的意思是 任意字元(.*?)的開頭,後邊不跟(?!)著我是參考這裡,了解(?!)的用法。

執行效果如下:

[例]當夫廣州之首難,武漢興師,革命精神,震鑠一世。('

#'>《'

#'>東方雜誌》2023年第9卷第1號)|欲去此不平等與壓制,繼政治革命而謀社會革命者,

社會主義是也。('

#'>《'

#'>青年雜誌

》2023年第1卷第1號)|俄

、德等國的勞工社會,首先看破他們的野心,不惜在大戰的時候,起了社會革命,防遏這資本家

**的戰爭。(

李大釗《庶民的勝利

》2023年)|近年來文學革命的運動漸見功效,除了幾個講「綱常名教」的經學家。('

#'>周作人《'

#'>思想革命》2023年)

[按] 「革命」本

指實施變革以應天命。「革命」現在經常指各個領域的新的改革,推動事物發生根本變革,引

起事物從舊質變為新質的飛躍。

這裡,我們就可以給特殊標籤的內容新增上鏈結了。

工作用到的東西,時間久了不用就會忘,及時記錄一下。

正規表示式替換很好用,但是如果要針對每一組資料處理完(為空或者取到對應資料)再替換,則需要遍歷每一次匹配結果再替換了。

正規表示式替換

正規表示式替換 每行的資料格式為 vcbi zuuu 001a465 kakid legos 要求變為格式為 vcbizuuu001 a465 kakid legos 替換掉第一部分和第二部分中間的空格,第二部分和第三部分中間的空格,其他的保持乙個空格 string originalstring v...

正規表示式 替換

正規表示式 替換 正規表示式 符合一定規則的而表示式.作用 用於專門操作字串。特點 用於一些特定的符號來表示一些 操作。這樣就簡化書寫。所以學習正規表示式 好處 可以簡化對字串的複雜操作。弊端 符號定義越多,正則越長,閱讀性越差 具體操作功能 1,匹配 string matches 方法.用規則整個...

正規表示式 替換

好了,現在終於到了解決3位或4位區號問題的時間了。正規表示式裡的替換指的是有幾種規則,如果滿足其中任意一種規則都應該當成匹配,具體方法是用 把不同的規則分隔開。聽不明白?沒關係,看例子 0 d d 0 d d 這個表示式能匹配兩種以連字型大小分隔的 號碼 一種是三位區號,8位本地號 如010 123...