请问正则式如何匹配这样的模版呢?

请问正则式如何匹配这样的模版呢?

比如这个简化的例子:


template1 var1
{
        Pos ID_2
        {
                Size = ( 27, 30 );
        };
        Pos ID_3
        {
                Size = ( 27, 30 );
        };
};

template2 var2
{
        Pos ID_2
        {
                Size = ( 27, 30 );
        };
        Pos ID_2
        {
                Size = ( 27, 30 );
        };
        Pos ID_3
        {
                Size = ( 27, 30 );
        };
};

我想分组出出 template1 和template2:

我写的
@class = $input =~ /\s*[a-zA-Z0-9]+\s+\w+\s+\{.*(\{.*\})+.*\s\};/gs;

分组没法处理,怎么样匹配外面的大括号呢?

多谢!
不知道你想要什么样的结果。
加入文件的内容是:
template1 var1
{
    Pos ID_2
    {
        Size = ( 27, 30 );
    };
    Pos ID_3
    {
        Size = ( 27, 30 );
    };
};

template2 var2
{
    Pos ID_2
    {
        Size = ( 27, 30 );
    };
    Pos ID_2
    {
        Size = ( 27, 30 );
    };
    Pos ID_3
    {
        Size = ( 27, 30 );
    };
};


我要把里面的多个
templatexxx
{
...
}

提取出来,生成不同的文件,
我就是正则表达式没有写好,无法正确的匹配 最外面的括号。
应该是可以根据动态正则表达式来匹配的,但是我忘记了。 -_-!

试试下面这个,主要是根据外层{}的行首位置的特点来匹配的:

[Copy to clipboard] [ - ]
CODE:
my $string=q/template1 var1
{
        pos id_2
        {
                size = ( 27, 30 );
        };
        pos id_3
        {
                size = ( 27, 30 );
        };
};

template2 var2
{
        pos id_2
        {
                size = ( 27, 30 );
        };
        pos id_2
        {
                size = ( 27, 30 );
        };
        pos id_3
        {
                size = ( 27, 30 );
        };
};
/;

while ($string =~ /^\w+\s+\w+\s*\n\{.*?\n\};/gsm) {
        print "\nFound one here  -->\n$&";
}

这样也可以,多谢,
我以为  gsm 中的 s m 没法一起用呢.
我再去看看"动态正则式"
http://www.regexlab.com/zh/regref.htm
这里有属性说明

表达式属性
说明

Ignorecase
默认情况下,表达式中的字母是要区分大小写的。配置为 Ignorecase 可使匹配时不区分大小写。有的表达式引擎,把 "大小写" 概念延伸至 UNICODE 范围的大小写。

Singleline
默认情况下,小数点 "." 匹配除了换行符(\n)以外的字符。配置为 Singleline 可使小数点可匹配包括换行符在内的所有字符。

Multiline
默认情况下,表达式 "^" 和 "$" 只匹配字符串的开始 ① 和结尾 ④ 位置。如:

①xxxxxxxxx②\n
③xxxxxxxxx④

配置为 Multiline 可以使 "^" 匹配 ① 外,还可以匹配换行符之后,下一行开始前 ③ 的位置,使 "$" 匹配 ④ 外,还可以匹配换行符之前,一行结束 ② 的位置。

Global
主要在将表达式用来替换时起作用,配置为 Global 表示替换所有的匹配。