RegExp:确定上面的上一行匹配是否包含文本

时间:2017-04-25 19:54:06

标签: javascript regex

给出以下文字:

"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse lacinia 
convallis ornare. 
<code>function js() {
     return $this->_js;
}
</code>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse lacinia 
convallis ornare."

我想确定<code>上方的行是文本行还是空白换行符。如果有文本,那么我将添加一个额外的换行符,以便代码和文本之间有一个空行。如果没有,那就继续吧。

:此

"Suspendisse lacinia convallis ornare
<code>function js(){...."

会转向此

"Suspendisse lacinia convallis ornare

<code>function js(){...."

鉴于JavaScript中没有 look-behinds ,是否有一种简单的方法可以做到这一点?

2 个答案:

答案 0 :(得分:2)

这是实现这一目标的最简单方法:

所有归功于WiktorStribiżew(查看他在OP中的评论)

示例代码段

const s = `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse lacinia 
convallis ornare. 
<code>function js() {
     return $this->_js;
}
</code>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse lacinia 
convallis ornare.`;

let rx = /(\S[^\S\r\n]*\n)(<code>)/g;
console.log(s.replace(rx, "$1\n$2"));

答案 1 :(得分:0)

一种简单的方法就是使用一个捕获组,然后在替换

中重复使用
/([^\n\r])(\n\r?)(?:<code>)/g

这与非换行符后跟换行符然后<code>匹配。

如果您将匹配替换为组1,将两次替换为组2,则最终会得到所需的双换行符,并保留所有不匹配的输入。

text.replace(/([^\n\r])(\n\r?)(?:<code>)/g, '$1$2$2');
为方便起见,

a working fiddle