如何使以下正则表达式匹配并替换未闭合的双引号?

How to make the following regex match and replace unclosed double quotes?

以下代码将直双引号替换为弯双引号:

 const input = `"Line 1"

"Line 2

"Line 3"

Line 4`
 
const output = input.replace(/\"(.*?)(\")/g, '“”')
 
console.log(output)

但是有一个问题。有时一行没有结束双引号(表示引号在下一行继续)。所以开头的双引号不会被替换:

`“Line 1”

"Line 2

“Line 3”

Line 4`

如何修改正则表达式,以便它也替换没有后跟结束双引号的开始双引号?

期望的输出:

`“Line 1”

“Line 2

“Line 3”

Line 4`

我会连续2次replace(),如果可以的话:

  • 一个用于缓存 "...'" 表单
  • 另一个用来抓剩下的"...
const output = input
    .replace(/\"(.*?)(\")/g, '“”')
    .replace(/\"(.*)/g, '“”')

但我不明白你是想在一个唯一的最终字符串中匹配多行结果,还是只是在每行的末尾添加引号

  1. 列表项

const input = `"Line 1"

    "Line 2

    "Line 3"

    Line 4`
     
      const output = input.replace(/"([^"/]*)"/g, '“”')

     
    console.log(output)

您可以使用

.replace(/^"([^"\n\r]*)"?$/gm, "“”")

regex demo。正则表达式匹配所有非重叠事件 (g),同时匹配行首 ^ 和行尾 $ (由于 m)和 means

  • ^ - 行首
  • " - 双引号
  • ([^"\n\r]*) - 第 1 组:除 "、CR 和 LF
  • 之外的任何零个或多个字符
  • "? - 一个可选的 " 字符
  • $ - 任何行的结尾。

查看 JavaScript 演示:

 const input = `"Line 1"

"Line 2

"Line 3"

Line 4`
 
const output = input.replace(/^"([^"\n\r]*)"?$/gm, '“”')
 
console.log(output)