簡體   English   中英

正則表達式,用於使用環顧四周刪除空行

[英]RegEx for removing empty lines using lookarounds

當目標是上下文的開始時,此匹配將失敗

let txt = `「呀啊,居然能見到比自己還年輕的母親,時空穿梭真是恐怖呀」

「哈,哈……」`;

console.dir(txt.match(/(?<=^[「『][^\n]+[』」])\n\n(?=[「『][^\n]+[』」]$)/gm));

但是如果在開始時添加換行符,則匹配將起作用

let txt = `
「呀啊,居然能見到比自己還年輕的母親,時空穿梭真是恐怖呀」

「哈,哈……」`;

有人知道正則表達式的哪一部分錯了嗎? 或這是(?<=)限制?

無論如何,使其只能通過一個正則表達式匹配它,並且仍然使用(?<=)


我的環境是支持lookBehind ,而我的其他一些規則則需要檢查prev,因此我希望可以通過lookBehindlookAhead處理此問題。


一個正則表達式是平均值,請勿使用2個或多個正則表達式來處理

expmale

    [/(?<=^[「『][^\n]+[』」])\n\n(?=[「『][^\n]+[』」](?:\n|$))/, '\n'],

    [/(?<=^[「『][^\n]+[』」])\n\n(?=[「『][^\n]+[』」]$)/gm, '\n'],

let txt = `「呀啊,居然能見到比自己還年輕的母親,時空穿梭真是恐怖呀」

「哈,哈……」

「呀啊,居然能見到比自己還年輕的母親,時空穿梭真是恐怖呀」

「哈,哈……」`;

console.dir(txt.replace(/(?<=^[「『][^\n]+[』」])\n\n(?=[「『][^\n]+[』」]$)/gm, '\n'));

預期的結果是

「呀啊,居然能見到比自己還年輕的母親,時空穿梭真是恐怖呀」\\n「哈,哈……」\\n「呀啊,居然能見到比自己還年輕的母親,時空穿梭真是恐怖呀」\\n「哈,哈……」

實際輸出是(在node.js 12中)

「呀啊,居然能見到比自己還年輕的母親,時空穿梭真是恐怖呀」\\n\\n「哈,哈……」\\n「呀啊,居然能見到比自己還年輕的母親,時空穿梭真是恐怖呀」\\n「哈,哈……」

您不需要斷言,因為它們是一次性的。
您不能在全局上下文中使用它們,因為您同時使用了它們
在它們中錨定^$

因此,它們是無用的。
要區分換行符,只需添加捕獲組。
另外,請勿在字符類中使用Unicode字符,您可以將
錯誤的一天。

就像我會做的那樣...

/^[\「\『][^\\r\\n]+[\』\」](\\s*\\r?\\n\\s*\\r?\\n\\s*)[\「\『][^\\r\\n]+[\』\」]$/

擴展

 ^ 
 [\u300c\u300e] 
 [^\r\n]+ 
 [\u300f\u300d] 
 (                             # (1 start)
      \s* 
      \r? \n \s* 
      \r? \n \s* 
 )                             # (1 end)
 [\u300c\u300e] 
 [^\r\n]+ 
 [\u300f\u300d] 
 $ 

也許,如果可以用其他一些表達式刪除空行,例如:

([「『][^\r\n]*[』」])\s*([「『][^\r\n]*[』」])

測試

 const regex = /([「『][^\\r\\n]*[』」])\\s*([「『][^\\r\\n]*[』」])/gm; const str = `「呀啊,居然能見到比自己還年輕的母親,時空穿梭真是恐怖呀」 「哈,哈……」 「呀啊,居然能見到比自己還年輕的母親,時空穿梭真是恐怖呀」 「哈,哈……」 「呀啊,居然能見到比自己還年輕的母親,時空穿梭真是恐怖呀」 「哈,哈……」 「呀啊,居然能見到比自己還年輕的母親,時空穿梭真是恐怖呀」 「哈,哈……」`; console.log(str.replace(regex, `$1\\n$2`)); 母親 const regex = /([「『][^\\r\\n]*[』」])\\s*([「『][^\\r\\n]*[』」])/gm; const str = `「呀啊,居然能見到比自己還年輕的母親,時空穿梭真是恐怖呀」 「哈,哈……」 「呀啊,居然能見到比自己還年輕的母親,時空穿梭真是恐怖呀」 「哈,哈……」 「呀啊,居然能見到比自己還年輕的母親,時空穿梭真是恐怖呀」 「哈,哈……」 「呀啊,居然能見到比自己還年輕的母親,時空穿梭真是恐怖呀」 「哈,哈……」`; console.log(str.replace(regex, `$1\\n$2`)); 母親 const regex = /([「『][^\\r\\n]*[』」])\\s*([「『][^\\r\\n]*[』」])/gm; const str = `「呀啊,居然能見到比自己還年輕的母親,時空穿梭真是恐怖呀」 「哈,哈……」 「呀啊,居然能見到比自己還年輕的母親,時空穿梭真是恐怖呀」 「哈,哈……」 「呀啊,居然能見到比自己還年輕的母親,時空穿梭真是恐怖呀」 「哈,哈……」 「呀啊,居然能見到比自己還年輕的母親,時空穿梭真是恐怖呀」 「哈,哈……」`; console.log(str.replace(regex, `$1\\n$2`)); 母親 const regex = /([「『][^\\r\\n]*[』」])\\s*([「『][^\\r\\n]*[』」])/gm; const str = `「呀啊,居然能見到比自己還年輕的母親,時空穿梭真是恐怖呀」 「哈,哈……」 「呀啊,居然能見到比自己還年輕的母親,時空穿梭真是恐怖呀」 「哈,哈……」 「呀啊,居然能見到比自己還年輕的母親,時空穿梭真是恐怖呀」 「哈,哈……」 「呀啊,居然能見到比自己還年輕的母親,時空穿梭真是恐怖呀」 「哈,哈……」`; console.log(str.replace(regex, `$1\\n$2`)); 

regex101.com的右上角對表達式進行了說明,如果您希望對其進行探索/簡化/修改,並且在此鏈接中 ,您可以根據需要觀看它與某些示例輸入的匹配方式。


環視演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM