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

时间:2013-08-02 07:32:40

标签: javascript regex

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

同样,我需要另一个正则表达式来匹配不再包含较长的换行符(如\n\n\n\n\n等)的双换行符(\n\n\n\n\n\n)。

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

3 个答案:

答案 0 :(得分:11)

由于JavaScript不支持lookbehind断言,因此您需要在 \之前匹配一个额外的字符,并记得稍后处理它(即,如果你需要恢复它)使用正则表达式匹配来修改原始字符串。)

(^|[^\n])\n(?!\n)

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

(^|[^\n])\n{2}(?!\n)

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

因此,如果您想用\n替换单个<br />,则必须执行

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

对于\n\n,它是

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

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.

答案 1 :(得分:2)

所有符合 ECMAScript 2018 support 后视的 JavaScript 环境。

因此,您可以使用

(?<!\n)\r?\n(?!\r?\n)

匹配单个 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 />") );

答案 2 :(得分:0)

要完全匹配相同角色的N个重复,您需要前瞻和后视(请参阅Match exactly N repetitions of the same character)。由于javascript不支持后者,因此纯正的regexp解决方案似乎是不可能的。您必须使用辅助函数,例如:

> x = "...a...aa...aaa...aaaa...a...aa"
"...a...aa...aaa...aaaa...a...aa"
> x.replace(/a+/g, function($0) {
        return $0.length == 2 ? '@@' : $0;
    })
"...a...@@...aaa...aaaa...a...@@"