正则表达式找到没有花括号的字符串,但允许使用“\ {”,“\}”

时间:2012-01-31 05:41:13

标签: regex

我有一个正则表达式来查找没有花括号“([^ \ {\}] +)”的字符串。这样它就可以从后面的字符串中提取“cde”:

“AB {CDE} F”

现在我需要使用“\}”将“{”与“\ {”和“}”一起转义。

因此,如果我的原始字符串是“ab {cd \ {e \}} f”,那么我需要提取“cd {e}” “cd \ {e \}”(我可以稍后删除“\”。

提前致谢。

4 个答案:

答案 0 :(得分:2)

这应该有效:

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

答案 1 :(得分:2)

请注意,任何正则表达式特殊字符都可以通过将它们放在一个范围内(即方括号)来有效地转义。所以:

  • [。]匹配文字句号。
  • [[]匹配左方括号。
  • [a]匹配字母a。
  • [{]匹配左大括号。

所以:

$ echo "ab{cde}f" | sed -r 's/[^{]*[{](.+)}.*/\1/'
cde
$ echo "ab{c\{d\}e}f" | sed -r 's/[^{]*[{](.+)}.*/\1/'
c\{d\}e

或者:

$ echo "ab{cde}f" | sed 's/[^{]*{//;s/}[^}]*$//'
cde
$ echo "ab{c\{d\}e}f" | sed 's/[^{]*{//;s/}[^}]*$//'
c\{d\}e

甚至:

$ php -r '$s="ab{cde}f"; print preg_replace("/[^{]*[{](.+)}.*", "$1", $s) . "\n";'
cde
$ php -r '$s="ab{c\{d\}e}f"; print preg_replace("/[^{]*[{](.+)}.*/", "$1", $s) . "\n";'
c\{d\}e

显然,这不会处理转义反斜杠。 : - )

答案 2 :(得分:2)

要允许你的大括号内的逃脱,你可以使用:

{((?:[^\\{}]+|\\.)*)}

Perl example

my $str = "ab{cd\\{e\\}} also foo{ad\\}ok\\{a\\{d}";
print "$str\n";
print join ', ', $str =~ /{((?:[^\\{}]+|\\.)*)}/g;

输出:

ab{cd\{e\}} also foo{ad\}ok\{a\{d}
cd\{e\}, ad\}ok\{a\{d

答案 3 :(得分:0)

\{(.+)\}将提取第一个和最后一个大括号之间的所有内容