我正在尝试使用javascript来获取正则表达式,以匹配花括号(和包含)所包含的区域,其中包含一个或多个换行符以及可能的标记嵌套。所以它匹配字符串中的{the quick brown fox ... lazy dog}
:
did you know {the quick brown fox
jumps
over the lazy dog} is a pangram?
但不是后面字符串中的花括号区域,因为它不包含换行符
did you know {the quick brown fox jumps over the lazy dog} is a pangram?
当有嵌套时我才会失败,因为我希望在下面的例子中只匹配brown \n fox
,因为它是包含换行符的直接括号。
did you know {the quick {brown
fox} jumps over the lazy dog} is
a pangram?
显而易见的/\{([^{]+)\}/g
将匹配卷曲集内的任何内容,但这可能意味着它可能会错误地匹配{the quick {brown \n fox}
和{brown \n fox} jumps over the lazy dog}
。我开始认为子串匹配可能就是这种方式,类似于像mustache js这样的css模板系统的方式。
答案 0 :(得分:3)
要确保字符串中至少有一个换行符,请使用如下所示的正则表达式:
/\{(?=.*\n)[^}]+\}/
控制台:
> "aaa{ccc}bbb".match(/\{(?=.*\n)[^}]+\}/)
null
> "aaa{ccc\ndddd}bbb".match(/\{(?=.*\n)[^}]+\}/)
["{ccc
dddd}"]
答案 1 :(得分:2)
此模式将有效/\{(?=.*\s)[^{}]+\}/
从控制台
a = "aa{aaaa
bb}b"
b = "aaaa{cccc}bbb"
c = "aaaaaaa{sssss{ddd
dd}bbb}sss"
a.match(/\{(?=.*\s)[^{}]+\}/)
["{aaaa
bb}"]
b.match(/\{(?=.*\s)[^{}]+\}/)
null
c.match(/\{(?=.*\s)[^{}]+\}/)
["{ddd
dd}"]
答案 2 :(得分:0)
答案 3 :(得分:0)
这个适用于你的字符串:
"did you know {the quick {brown\nfox} jumps over the lazy dog} is\na pangram?"
.match(/\{[^{}]+\}/)
返回{brown\nfox}
。
/\{[^{}]+\}/
:
{
。{
或}
。}
答案 4 :(得分:0)
这将起作用尝试
\{([^{]+?)\}
答案 5 :(得分:0)
我认为这就是你所追求的:
/\{[^{}\n]*\n[^{}]*\}/
[^{}\n]*\n
消耗所有内容直到下一个换行符,但如果它首先看到括号,则会失败。
然后[^{}]*
会消耗其余部分,因为如果有更多的换行符并不重要。
我假设您的行分隔符仅包含换行符(\n
)或回车符加行换行符(\r\n
)。还有其他一些可能性,但它们非常罕见。