JavaScript正则表达式匹配多行

6
我的多行字符串如下所示:
###
some content
that I need to match
and might have some special character in it such as | <> []
###

我正在尝试获取两个井号之间的内容。我尝试使用以下正则表达式,但它无法匹配并返回null。

var regex = /### ((.|\n)*) ###/;
var match= regex.exec(aboveContentAsString);
console.log(match[1]);

2
去掉正则表达式中的空格 - Les
### ( 尝试匹配后面跟着一个空格的 ###。然而在你的示例文本中,### 后面是一个换行符,所以没有匹配成功。你为什么在表达式中加入了空格呢? - Felix Kling
3个回答

19
JavaScript缺少(单行/点全部)正则表达式选项,但是您可以通过将.替换为[\s\S](匹配任何空格或非空格字符,这基本上意味着匹配所有内容)来解决它。此外,使您的量词懒惰,并且去掉模式中的空格,因为JS中也没有x(扩展)选项:
var regex = /###([\s\S]*?)###/;

示例:

var input = "###\nsome content\nthat I need to match\nand might have some special character in it such as | <> []\n###";

var regex = /###([\s\S]*?)###/;
document.getElementById("output").innerText = regex.exec(input)[1];
<pre id="output"></pre>

你原来的方法可能可以工作,但我会在里面添加 \r

var regex = /###((?:.|[\r\n])*?)###/;

但是我更喜欢[\s\S]这种方法,因为它更短并且(在我看来)更易读。


2
附注:可以是任何不同的一组,例如[\d\D][\w\W],甚至是[^]除了什么都不包括):-) - dognose
1
@dognose 注意使用 [^] - 我建议不要使用它,因为它只在JS中“工作”,并且不是标准的正则表达式语法:在其他语言中,] 将被解释为 \] 并且字符类将无法终止(语法错误)。 - Lucas Trzesniewski
你是对的。正则表达式提示 #25566 已记录 :P - dognose

0
Javascript没有“点匹配所有选项” - 因此只需使用点或空格即可。(首个\s*用于确保您的匹配不以换行符开头 - 当然这不是必须的。)
^###\s*((?:.|\s)*)###$

Regular expression visualization

Debuggex演示


0
如果您不希望正则表达式匹配三个井号,可以尝试类似以下的代码:
(?![###])[^#]((.|\s)[^#])*。这里使用了负向先行断言来开始匹配,只有在无法匹配###时才会开始匹配。它从匹配开始,并一直持续到遇到另一个井号为止。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接