正则表达式匹配单个新行.正则表达式匹配双新线

11 javascript regex

我正在尝试构造一个匹配单独换行符(\n)的正则表达式.

类似地,我需要另一个正则表达式来匹配双换行符(\n\n),这些换行符不是较长的换行符\n\n\n或类似行\n\n\n\n\n\n等的一部分.

\n(?!\n)\n\n(?!\n)匹配太多(它们与较长的换行序列中的最后一个换行符相匹配).我该怎么做?

Tim*_*ker 12

由于JavaScript不支持向后断言,你需要一个额外的字符匹配之前\n`s并记住以后,处理它(即,如果使用正则表达式匹配修改原始字符串恢复它).

(^|[^\n])\n(?!\n)
Run Code Online (Sandbox Code Playgroud)

匹配单个换行符加上前一个字符,和

(^|[^\n])\n{2}(?!\n)
Run Code Online (Sandbox Code Playgroud)

匹配双重换行符加上前一个字符.

所以,如果你想更换一个\n具有<br />,例如,你所要做的

result = subject.replace(/(^|[^\n])\n(?!\n)/g, "$1<br />");
Run Code Online (Sandbox Code Playgroud)

因为\n\n,是的

result = subject.replace(/(^|[^\n])\n{2}(?!\n)/g, "$1<br />");
Run Code Online (Sandbox Code Playgroud)

regex101上看到它

说明:

(       # Match and capture in group number 1:
 ^      # Either the start of the string
|       # or
 [^\n]  # any character except newline.
)       # End of group 1. This submatch will be saved in $1.
\n{2}   # Now match two newlines.
(?!\n)  # Assert that the next character is not a newline.
Run Code Online (Sandbox Code Playgroud)


Wik*_*żew 5

所有符合ECMAScript 2018 的 JavaScript 环境都支持lookbehind。

因此,您可以使用

(?<!\n)\r?\n(?!\r?\n)
Run Code Online (Sandbox Code Playgroud)

匹配单个 CRLF 或 LF libne 中断序列。如果需要匹配两个换行符,请将\r?\n使用模式部分包装在一个组中,并为其设置一个量词:(?<!\n)(?:\r?\n){2}(?!\r?\n)匹配双换行符序列。

细节

  • (?<!\n)- 如果当前位置左侧紧邻 LF 字符,则负向后查找会使匹配失败
  • \r?\n- 一个可选的 CR,然后是一个 LF 字符
  • (?!\r?\n) - 如果存在可选的 CR,然后紧邻当前位置右侧的 LF 字符,则会导致匹配失败的负向前查找。

请参阅 JavaScript 演示,了解如何替换段落内换行序列,即那些单换行序列:

const text = "This\nis\nparagraph\none\n\nThis is the\nsecond\nparagraph";
console.log( text.replace(/(?<!\n)\r?\n(?!\r?\n)/g, "<br />") );
Run Code Online (Sandbox Code Playgroud)