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)
所有符合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)