首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正则表达式以匹配单个新行。匹配双新行的正则表达式

正则表达式以匹配单个新行。匹配双新行的正则表达式
EN

Stack Overflow用户
提问于 2013-08-02 15:32:40
回答 3查看 10K关注 0票数 12

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

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

\n(?!\n)\n\n(?!\n)匹配太多(它们匹配较长换行序列中的最后一个换行符)。我能做些什么呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-02 16:47:23

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

代码语言:javascript
复制
(^|[^\n])\n(?!\n)

匹配单个换行符和前面的字符,并且

代码语言:javascript
复制
(^|[^\n])\n{2}(?!\n)

匹配两个换行符加上前面的字符。

因此,例如,如果您想用<br />替换单个\n,您必须这样做

代码语言:javascript
复制
result = subject.replace(/(^|[^\n])\n(?!\n)/g, "$1<br />");

对于\n\n来说,它是

代码语言:javascript
复制
result = subject.replace(/(^|[^\n])\n{2}(?!\n)/g, "$1<br />");

regex101上查看

说明:

代码语言:javascript
复制
(       # 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.
票数 14
EN

Stack Overflow用户

发布于 2021-02-10 20:05:10

所有兼容ECMAScript 2018 support lookbehind的JavaScript环境。

因此,您可以使用

代码语言:javascript
复制
(?<!\n)\r?\n(?!\r?\n)

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

详细信息

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

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

代码语言: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
EN

Stack Overflow用户

发布于 2013-08-02 16:35:56

要精确匹配相同字符的N个重复项,您需要lookaheads和lookbehinds (参见Match exactly N repetitions of the same character)。由于javascript不支持后者,纯粹的regexp解决方案似乎是不可能的。您必须使用helper函数,例如:

代码语言:javascript
复制
> 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...@@"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18011260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档