javascript正则表达式将大括号与换行符匹配,但不是没有

时间:2014-02-28 07:31:17

标签: javascript regex

我正在尝试使用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模板系统的方式。

6 个答案:

答案 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)

试试这个:

   \{([^{\n]+)\}

我在这里测试了它:http://regex101.com/r/vJ6gU1

答案 3 :(得分:0)

这个适用于你的字符串:

 "did you know {the quick {brown\nfox} jumps over the lazy dog} is\na pangram?"
.match(/\{[^{}]+\}/)

返回{brown\nfox}

/\{[^{}]+\}/

  1. 匹配{
  2. 匹配不是{}
  3. 的所有内容
  4. 匹配}
  5. DEMO

答案 4 :(得分:0)

这将起作用尝试

\{([^{]+?)\}

答案 5 :(得分:0)

我认为这就是你所追求的:

/\{[^{}\n]*\n[^{}]*\}/

[^{}\n]*\n消耗所有内容直到下一个换行符,但如果它首先看到括号,则会失败。

然后[^{}]*会消耗其余部分,因为如果有更多的换行符并不重要。

我假设您的行分隔符仅包含换行符(\n)或回车符加行换行符(\r\n)。还有其他一些可能性,但它们非常罕见。