如何批量清除中文和西文字元之間的空格?

原先在網頁環境下使用的文章將用於出版環境,被要求清除所有中文和西文字元之間的空格(比如:「學習 CSS 知識」 要改為 「學習CSS知識」)。因此,正在尋找批量自動化處理的方案。

相關問題:

中英文混排時中文與英文之間是否要有空格? - 網頁設計 (Web Design)


正則表達式

漢字標準格式「漢字-西文混排間隙」嚴格模式下的正則表達式應該能滿足這個需求。它支援:

  • 中日韓越統一漢字基本區段及擴展A-D區(未來的擴展E、F區也能支援)

  • 《康熙》及簡化字部首、筆畫、意音文字描述字元、意音數字「〇」

  • 日文假名

  • 包含附加變音符號的所有西文字元,有:

    • 拉丁字母
    • 希臘字母
    • 西里爾字母
  • 西文開始/結束括注號(如:?! ?? 『』 「」……等)

// 漢字在前
Han.TYPESET.hws.strict[0]
// 漢字在後
Han.TYPESET.hws.strict[1]

註:不處理西文點號及漢字標點(如句號、逗號……等)

代碼見:https://github.com/ethantw/Han/blob/03b050a/dist/han.js#L430-433

漢字-西文混排間隙示例:http://ethantw.github.io/Han/latest/hws.html

跨節點的操作

漢字標準格式的字元替換方法「Han.find()」 [1]使用findAndReplaceDOMText類庫 [2],支援跨元素節點的文字替換,缺點是必須在支援DOM的環境下方能工作。

下面範例的空白是可以正確被清除的。

&
漢字 &Latin &かな。
&
漢字&Latin&かな。

[1]: https://css.hanzi.co/manual/js-api#find

[2]: https://github.com/padolsey/findAndReplaceDOMText/

清除文本中,漢字與西文間的空格

let hinst = Han.find( document.body )
.replace( Han.TYPESET.hws.strict[0], "$1$2" )
.replace( Han.TYPESET.hws.strict[1], "$1$2" )

把空格加回來,

hinst.revert( "all" )


JavaScript:

var rawText = "學習 Regular Expression 那一套理論";
console.log(rawText.replace(/([^w]) (w)/, "$1$2").replace(/(w) ([^w])/, "$1$2"));


中文是 [u4e00-u9fbb]

分兩步吧:

第一步,刪除左邊漢字,右邊字母的情況:

(?&<=[u4e00-u9fbb])s+(?=[a-zA-Z])

第二步,反過來,刪除左邊字母,右邊漢字的情況:

(?&<=[a-zA-Z])s+(?=[u4e00-u9fbb])

組合起來,也就是中間加一個「|」:

(?&<=[a-zA-Z])s+(?=[u4e00-u9fbb])|(?&<=[u4e00-u9fbb])s+(?=[a-zA-Z])

希望可以幫上忙


推薦閱讀:

中文排版里,若破折號出現在行末應如何處理?
如何提高使用 LaTeX 的效率?
報紙的排版方式,相對於雜誌有什麼優勢?
Word 使用 tab 縮進不一致是為什麼?
在UGC互聯網產品運營中,如何引導用戶發布內容時形成良好的排版習慣?

TAG:排版 | 字體排印 | 正則表達式 | 文字編輯 | 字元串 |