2025年11月12日 星期三

用Calibre把TXT轉成EPUB電子書 ,按章節分頁、自動產生目錄

批次修改TXT章節標題格式

首先我們可以先用Notepad++開啟TXT檔案稍微檢查一下,清除一些不必要的資訊或廣告,然後做初步的章節標題格式加註。
規則運算式搜尋及取代:
第(.*?)卷 → #第$1卷
第(.*?)章 → ##第$1章
# 是第一層標題
## 是第二層標題,以此類推


用Calibre把TXT轉EPUB

將TXT檔加入Calibre軟體後,使用「轉換書本」功能。

首先確認輸入格式為TXT,輸出格式為EPUB。
在「結構偵測」分頁中:
「偵測章節於 (XPath 表示式)」內容原本為英文判斷式:
//*[((name()='h1' or name()='h2') and re:test(., '\s*((chapter|book|section|part)\s+)|((prolog|prologue|epilogue)(\s+|$))', 'i')) or @class = 'chapter']

我們把它改成中文版:
//*[re:test(., "^\s*(簡介|內容簡介|序|推薦序|楔子|尾聲|後記|番外|[第卷][0123456789一二三四五六七八九十零〇百千兩]*[卷回部章節集])\s*([^課].*|)$", "i")]

下面「章節標記」選擇「pagebreak」把新章節分頁。

在「TXT輸入」分頁中,「規格化樣式」選擇「markdown」

按確定輸出後,選編輯書本、編輯目錄來檢查修改,存檔後大功告成。

如何在Notepad++使用RegEx來搜尋取代文數字空白和換行符號

Notepad++ 是台灣工程師侯今吾開發的純文字編輯器,自由、開源,而且非常高效好用,我個人三十幾年來使用過各式大小文字編輯軟體,最後只有這個軟體每台電腦都安裝,至今仍日常使用,而且作者很有人道關懷精神令人敬佩,好人好軟體還不用爆。

作業系統內建的記事本(Notepad),編輯文字時無法條件式尋找,也無法處理空白和換行符號,這個時候使用Notepad++就很適合。

搜尋換行符號:
換行符號CR:\r
換行符號LF:\n
Windows系統的格式:\r\n
Linux系統的格式:\r

搜尋「空白」:
注意全形空白 與半形空白 的差別
空白符號 :\s
tab換行的空白:\t
html的空白:&nbsp:

規則運算式(正規表達式)(Regular Expression)(RegEx)是什麼?
範例格式 [A-z]{2,4}
[]裡面代表要搜尋的目標範圍,根據預設,比對會區分大小寫。
  • [a-z] 只找小寫
  • [A-z] 找大寫+小寫
  • [0-9] 只找數字 (也可以只指定1-5)
  • [A-z0-9] 找同時包含大小寫與數字混合的字
{}裡面的數字代表要搜尋的數量長度範圍
  • {2,4} 找符合條件而且長度是2個字~4個字
  • {3,} 找符合條件且長度最少3個字或更多
  • {3} 找符合條件且長度剛好為3個字

規則運算式指定數字串搜尋實例
例如 [0-9]{10} ,可以搜尋10碼連續數字
手機號碼: 0912345678 聯絡人姓名
例如 [0-9]{4}-[0-9]{3}-[0-9]{3} ,可以搜尋包含-的格式化數字
手機號碼: 0912-345-678 聯絡人姓名

除了上述範圍範例,字元類別還有
  • By → 只找大寫B+小寫y
  • ^Bay → ^代表否定,這個例子找不是大寫B、小寫a、小寫y的其他字
  • a.e → .代表除了「\n」以外任何單一字元,類似DOS的?,此例找a開頭e結尾的三字字串
  • \d → 代表任何十進位數,與前述[0-9]類似,故上述手機號碼搜尋範例也可以寫成\d{4}-\d{3}-\d{3}
  • \D → 代表任何十進位數以外的字元及空格,與[^0-9]類似
  • \w → 代表任何英數字元,與前述[A-z0-9]類似
  • \W → 代表任何非英數字元,比如說空格、符號、標點
  • \s → 代表空格字元
  • \S → 代表非空格字元

除了上述範圍範例,數量類別還有
  • * → 找符合條件零次或多次
  • + → 找符合條件一次或多次
  • ? → 找符合條件零次或一次
  • *? → 找符合條件零次以上,但越少次越好
  • +?* → 找符合條件一次或多次,但越少次越好
  • ?? → 找符合條件零次或一次,但越少次越好

組合使用範例
  • \s* → 找出空格,不限數量
  • a.*c → "abcbc" 中的 "abcbc"
  • a.*?c → "abcbc" 中的 "abc"
  • be+ → "been" 中的 "bee"、"bent" 中的 "be"
  • be+? → "been" 中的 "be"、"bent" 中的 "be"
  • [0-9-[2468]]+ → 比對 0 到 9 中不包括 2、4、6 和 8 的任何出現一次或多次的字元。 換句話說,就是比對出現一次或多次的零或奇數



詳細用法還有很多,我去微軟的網站搬來了簡介參考如下:

規則運算式語言 - 快速參考

規則運算式是規則運算式引擎嘗試在輸入文字中比對的模式。 模式是由一個或多個字元常值、運算子或建構所組成。 如需簡介,請參閱 .NET 規則運算式

此快速參考中的每一節都列出您可以用於定義規則運算式的特定某類字元、運算子和建構。

我們也以兩種格式提供這項資訊,您可以下載並列印以方便參考:

逸出字元

正則表達式中的反斜杠字元 (\) 表示其後面的字元是特殊字元(如下表所示),或應該以字面方式解譯。 如需詳細資訊,請參閱逸出字元

逸出的字元描述模式比對
\a比對警示字元 \u0007。\a"Error!" + '\u0007' 中的 "\u0007"
\b在字元類別中,比對退格鍵 \u0008。[\b]{3,}"\b\b\b\b" 中的 "\b\b\b\b"
\t比對定位點 \u0009。(\w+)\t"item1\titem2\t" 中的 "item1\t""item2\t"
\r比對歸位字元 \u000D (\r 不等於新行字元 \n。)\r\n(\w+)"\r\nThese are\ntwo lines." 中的 "\r\nThese"
\v比對垂直定位點 \u000B。[\v]{2,}"\v\v\v" 中的 "\v\v\v"
\f比對換頁字元 \u000C。[\f]{2,}"\f\f\f" 中的 "\f\f\f"
\n比對新行字元 \u000A。\r\n(\w+)"\r\nThese are\ntwo lines." 中的 "\r\nThese"
\e比對逸出字元 \u001B。\e"\x001B" 中的 "\x001B"
\ nnn使用八進位表示法指定字元 (nnn 由兩位數或三位數組成)。\w\040\w"a bc d" 中的 "a b""c d"
\x nn使用十六進位表示指定字元 (nn 由剛好兩位數組成)。\w\x20\w"a bc d" 中的 "a b""c d"
\c X

\c x
比對 X 或 x所指定的 ASCII 控制字元,其中 X 或 x 是控制字元的字母。\cC"\x0003" 中的 "\x0003" (Ctrl-C)
\u nnnn使用十六進位表示比對 Unicode 字元 (剛好四位數,如 nnnn所表示)。\w\u0020\w"a bc d" 中的 "a b""c d"
\當後面加上的字元不是這張表和此主題其他表格中指出的逸出字元時,則比對該字元。 例如, \* 與 \x2A 相同,而 \. 與 \x2E 相同。 這可讓規則運算式引擎釐清語言項目 (例如 * 或 ?) 和字元常值 (以 \* 或 \? 表示)。\d+[\+-x\*]\d+"(2+2) * 3*9" 中的 "2+2" 和 "3*9"

字元類別

字元類別會比對一組字元中的任何一個字元。 字元類別包含下表列出的語言項目。 如需詳細資訊,請參閱字元類別

字元類別描述模式比對
[character_group ]比對character_group中的任何單一字元。 根據預設,比對會區分大小寫。[ae]"gray" 中的 "a"

"lane" 中的 "a""e"
[^character_group ]否定:比對不在 character_group 中的任何單一字元。 根據預設,character_group 中的字元會區分大小寫。[^aei]"reign" 中的 "r""g""n"
[第一 -最後 ]字元範圍:比對範圍中第一個到最後一個字元的任何單一字元。[A-Z]"AB123" 中的 "A""B"
.通配符:比對 以外的\n任何單一字元。

若要比對常值句號字元 (. 或 \u002E),您必須在它前面加上逸出字元 (\.)。
a.e"nave" 中的 "ave"

"water" 中的 "ate"
\p{名字 }比對 Unicode 一般類別或名稱指定之具名區塊中的任何單一字元。\p{Lu}

\p{IsCyrillic}
"City Lights" 中的 "C""L"

"ДЖem" 中的 "Д""Ж"
\P{名字 }比對不在 Unicode 一般類別或名稱指定之具名區塊中的任何單一字元。\P{Lu}

\P{IsCyrillic}
"City" 中的 "i""t""y"

"ДЖem" 中的 "e""m"
\w比對任何 單字字元\w"ID A1.3" 中的 "I""D""A""1""3"
\W比對任何 非單字字元\W"ID A1.3" 中的 " ""."
\s比對任何 空格符\w\s"ID A1.3" 中的 "D "
\S比對任何 非空格符\s\S"int __ctr" 中的 " _"
\d符合任何 十進位數\d"4 = IV" 中的 "4"
\D比對十進位數以外的任何字元。\D"4 = IV" 中的 " ""="" ""I""V"

錨點

錨點 (即原子零寬度判斷提示) 會造成根據字串中的目前位置來決定比對成功或失敗,但不會造成引擎在字串中前進或是取用字元。 下表列出的 metacharacter 是錨點。 如需詳細資訊,請參閱錨點

Assertion描述模式比對
^根據預設,比對必須在字串的開頭開始;在多行模式中,它必須在一行的開頭開始。^\d{3}"901-333-" 中的 "901"
$根據預設,比對必須發生在字串的結尾或字串結尾的 \n 之前;在多行模式中,它必須發生在一行的結尾之前,或一行結尾的 \n 之前。-\d{3}$"-901-333" 中的 "-333"
\A比對必須發生在字串開頭。\A\d{3}"901-333-" 中的 "901"
\Z比對必須發生在字串結尾,或發生在字串結尾的 \n 之前。-\d{3}\Z"-901-333" 中的 "-333"
\z比對必須發生在字串結尾。-\d{3}\z"-901-333" 中的 "-333"
\G比對必須發生在上一個比對結束的點,或者如果先前沒有相符專案,則發生在相符開始的字串中的位置。\G\(\d\)"(1)(3)(5)[7](9)" 中的 "(1)""(3)""(5)"
\b比對必須發生在 \w (英數) 和 \W (非英數) 字元之間的界限上。\b\w+\s\w+\b"them theme them them" 中的 "them theme""them them"
\B比對不可以發生在 \b 界限上。\Bend\w*\b"end sends endure lender" 中的 "ends""ender"

群組建構

分組建構會描寫規則運算式的子運算式,而且通常會擷取輸入字串的子字串。 分組建構包含下表列出的語言元素。 如需詳細資訊,請參閱群組建構

分組建構描述模式比對
( subexpression )擷取符合的子運算式,並指派以一為起始的序號給它。(\w)\1"deep" 中的 "ee"
(?<名稱 >subexpression )

(?'名稱 'subexpression )
將符合的子運算式擷取到具名群組中。(?<double>\w)\k<double>"deep" 中的 "ee"
(?<name1 -name2 >subexpression )

(?'name1 -name2 'subexpression )
定義對稱群組定義。 如需詳細資訊,請參閱 Grouping Constructs中的<對稱群組定義>一節。(((?'Open'\()[^\(\)]*)+((?'Close-Open'\))[^\(\)]*)+)*(?(Open)(?!))$"3+2^((1-3)*(3-1))" 中的 "((1-3)*(3-1))"
(?: subexpression )定義非擷取型群組。Write(?:Line)?"Console.WriteLine()" 中的 "WriteLine"

"Console.Write(value)" 中的 "Write"
(?imnsx-imnsx: subexpression )套用或停用 子運算式內指定的選項。 如需詳細資訊,請參閱 Regular Expression OptionsA\d{2}(?i:\w+)\b"A12xl A12XL a12xl" 中的 "A12xl""A12XL"
(?= subexpression )零寬度右合樣 (Positive Lookahead) 判斷提示。\b\w+\b(?=.+and.+)"cats""dogs"
in
"cats, dogs and some mice."
(?! subexpression )零寬度右不合樣 (Negative Lookahead) 判斷提示。\b\w+\b(?!.+and.+)"and"、 、 "some""mice"
in
"cats, dogs and some mice."
(?<= subexpression )零寬度左合樣 (Positive Lookbehind) 判斷提示。\b\w+\b(?<=.+and.+)

———————————

\b\w+\b(?<=.+and.*)
"some""mice"
in
"cats, dogs and some mice."
————————————
"and"、 、 "some""mice"
in
"cats, dogs and some mice."
(?<! subexpression )零寬度左不合樣 (Negative Lookbehind) 判斷提示。\b\w+\b(?<!.+and.+)

———————————

\b\w+\b(?<!.+and.*)
"cats"、 、 "dogs""and"
in
"cats, dogs and some mice."
————————————
"cats""dogs"
in
"cats, dogs and some mice."
(?> subexpression )不可部分完成的群組。'(?>a|ab)c"ac" 在"ac"

中沒有任何專案"abc"

一目了然

當正則表達式引擎叫用 查詢表達式時,它會採用從目前位置到達原始字串的開頭(lookbehind)或 end (lookahead) 的子字元串,然後使用查詢模式在該子字元串上執行 Regex.IsMatch 。 然後,這個子表達式的結果成功取決於它是正判斷提示還是負面判斷提示。

Lookaround名稱函式
(?=check)正面外觀判斷提示字串中目前位置緊隨其後的是 「檢查」
(?<=check)正面Lookbehind判斷提示字串中目前位置前面緊接的專案為 "check"
(?!check)負面 Lookahead判斷提示字串中目前位置緊隨其後的不是 「檢查」
(?<!check)負面Lookbehind判斷提示字串中目前位置前面緊接的專案不是 「檢查」

比對之後, 即使模式的其餘部分因為相符而失敗,也不會重新評估不可部分完成的群組 。 當數量值發生在不可部分完成的群組或模式的其餘部分時,這可能會大幅改善效能。

Quantifiers

數量詞指定上一個項目 (可能是字元、群組或字元類別) 必須在輸入字串中出現多少次,才算符合。 數量詞包含下表列出的語言項目。 如需詳細資訊,請參閱數量詞

數量詞描述模式比對
*比對上一個項目零次或多次。a.*c"abcbc" 中的 "abcbc"
+比對上一個項目一次或多次。"be+""been" 中的 "bee""bent" 中的 "be"
?比對上一個項目零次或一次。"rai?""rain" 中的 "rai"
{ n }比對上一個項目剛好 n 次。",\d{3}""1,043.6" 中的 ",043""9,876,543,210" 中的 ",876"",543" 和 ",210"
{ n ,}比對上一個項目至少 n 次。"\d{2,}""166"、 、 "29""1930"
{ n , m }比對上一個項目至少 n 次,但不超過 m 次。"\d{3,5}""166""17668"

"193024" 中的 "19302"
*?比對上一個項目零次以上,但越少次越好。a.*?c"abcbc" 中的 "abc"
+?比對上一個項目一次或多次,但越少次越好。"be+?""been" 中的 "be""bent" 中的 "be"
??比對上一個項目零次或一次,但越少次越好。"rai??""rain" 中的 "ra"
{ n }?比對前一個項目剛好 n 次。",\d{3}?""1,043.6" 中的 ",043""9,876,543,210" 中的 ",876"",543" 和 ",210"
{ n ,}?比對前一個項目至少 n 次,但次數愈少愈好。"\d{2,}?""166"、 、 "29""1930"
{ n , m }?比對前一個項目 n 次到 m 次,但越少次越好。"\d{3,5}?""166""17668"

"193024" 中的 "193""024"

反向參考建構

反向參考可於後來在相同規則運算式中再識別先前符合的子運算式。 下表列出 .NET 中規則運算式所支援的反向參考建構。 如需詳細資訊,請參閱 Backreference Constructs

反向參考建構描述模式比對
\ number反向參考。 比對編號子運算式的值。(\w)\1"seek" 中的 "ee"
\k<名字 >命名的反向參考。 比對具名運算式的值。(?<char>\w)\k<char>"seek" 中的 "ee"

Alternation Constructs

替代建構會修改規則運算式來啟用二選一比對。 這些建構包含下表列出的語言元素。 如需詳細資訊,請參閱替代建構

交替建構描述模式比對
|比對由分隔號 (|) 字元所隔開的任何一個項目。th(e|is|at)"this is the day." 中的 "the""this"
(?( expression ) yes | no )

(?( expression ) yes )
如果 expression 所指定的規則運算式模式相符,則比對 yes ,否則比對選擇性的 no 部分。 expression 會解譯為零寬度判斷提示。

若要避免具名或編號擷取群組的模棱兩可,您可以選擇性地使用明確的判斷提示,如下所示:
(?( (?= expression ) ) yes | no )
(?(A)A\d{2}\b|\b\d{3}\b)"A10 C103 910" 中的 "A10""910"
(?( name ) yes | no )

(?( name ) yes )
如果 name (具名或編號擷取群組) 有相符項目,則比對 yes,否則比對選擇性的 no(?<quoted>")?(?(quoted).+?"|\S+\s)"Dogs.jpg \"Yiska playing.jpg\"" 中的 "Dogs.jpg ""\"Yiska playing.jpg\""

替代

替代是取代模式中支援的規則運算式語言元素。 如需詳細資訊,請參閱替代。 下表列出的 metacharacter 是原子零寬度判斷提示。

字元描述模式取代模式輸入字串結果字串
$ number替代群組 number所比對的子字串。\b(\w+)(\s)(\w+)\b$3$2$1"one two""two one"
${名字 }替代具名群組 name所比對的子字串。\b(?<word1>\w+)(\s)(?<word2>\w+)\b${word2} ${word1}"one two""two one"
$$替代常值 "$"。\b(\d+)\s?USD$$$1"103 USD""$103"
$&替代整個符合項目的複本。\$?\d*\.?\d+**$&**"$1.30""**$1.30**"
$`替代輸入字串中符合字串前面的所有文字。B+$`"AABBCC""AAAACC"
$'替代輸入字串中符合字串後面的所有文字。B+$'"AABBCC""AACCCC"
$+替代已擷取的最後一個群組。B+(C+)$+"AABBCCDD""AACCDD"
$_替代整個輸入字串。B+$_"AABBCC""AAAABBCCCC"

規則運算式選項

您可以指定選項,以控制規則運算式引擎如何解譯規則運算式模式。 這些選項中有許多可以指定為內嵌 (在規則運算式模式中) 或是一個或多個 RegexOptions 常數。 這個快速參考只列出內嵌選項。 如需內嵌和 RegexOptions 選項的詳細資訊,請參閱規則運算式選項

您可以透過兩種方式指定內嵌選項:

  • 使用 其他建構 (?imnsx-imnsx),其中選項或選項集前的減號 (-) 會關閉這些選項。 例如,(?i-mn) 會開啟不區分大小寫的比對 (i)、關閉多行模式 (m),以及關閉未命名的群組擷取 (n)。 選項會從定義該選項的位置開始套用至規則運算式模式並且保持生效,直到模式結尾或出現另一個建構反轉選項為止。
  • 使用群組建構(?imnsx-imnsx:subexpression),只針對指定的群組定義選項。

.NET 正則表示式引擎支援下列內嵌選項:

選項描述模式比對
i使用不區分大小寫的比對方式。\b(?i)a(?-i)a\w+\b"aardvark AAAuto aaaAuto Adam breakfast" 中的 "aardvark""aaaAuto"
m使用多行模式。 ^ 和 $ 會比對行的開頭與結尾,而不是字串的開始和結尾。如需範例,請參閱規則運算式選項中的<多行模式>一節。
n不擷取未命名的群組。如需範例,請參閱規則運算式選項中的<僅明確擷取>一節。
s使用單行模式。如需範例,請參閱規則運算式選項中的<單行模式>一節。
x忽略規則運算式模式中未逸出的空白字元。\b(?x) \d+ \s \w+"1 aardvark 2 cats IV centurions" 中的 "1 aardvark""2 cats"

其他建構

其他建構會修改規則運算式模式或提供其相關資訊。 下表列出 .NET 所支援的其他建構。 如需詳細資訊,請參閱其他建構

建構定義範例
(?imnsx-imnsx)在模式中間設定或停用選項,例如不區分大小寫。如需詳細資訊,請參閱規則運算式選項\bA(?i)b\w+\b 會比對 "ABA Able Act" 中的 "ABA""Able"
(?#評論 )內嵌註解。 註解會在第一個右括號結束。\bA(?#Matches words starting with A)\w+\b
# [至行尾]X 模式註解。 註解從未逸出的 # 開始,並延續到行尾。(?x)\bA\w+\b#Matches words starting with A

另請參閱