免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1756 | 回复: 5
打印 上一主题 下一主题

请问正则式如何匹配这样的模版呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-08 21:05 |只看该作者 |倒序浏览
比如这个简化的例子:


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;

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

多谢!

论坛徽章:
0
2 [报告]
发表于 2008-04-08 23:16 |只看该作者
不知道你想要什么样的结果。

论坛徽章:
0
3 [报告]
发表于 2008-04-08 23:56 |只看该作者
加入文件的内容是:
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
{
...
}

提取出来,生成不同的文件,
我就是正则表达式没有写好,无法正确的匹配 最外面的括号。

论坛徽章:
0
4 [报告]
发表于 2008-04-09 00:29 |只看该作者
应该是可以根据动态正则表达式来匹配的,但是我忘记了。 -_-!

试试下面这个,主要是根据外层{}的行首位置的特点来匹配的:
  1. my $string=q/template1 var1
  2. {
  3.         pos id_2
  4.         {
  5.                 size = ( 27, 30 );
  6.         };
  7.         pos id_3
  8.         {
  9.                 size = ( 27, 30 );
  10.         };
  11. };

  12. template2 var2
  13. {
  14.         pos id_2
  15.         {
  16.                 size = ( 27, 30 );
  17.         };
  18.         pos id_2
  19.         {
  20.                 size = ( 27, 30 );
  21.         };
  22.         pos id_3
  23.         {
  24.                 size = ( 27, 30 );
  25.         };
  26. };
  27. /;

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

论坛徽章:
0
5 [报告]
发表于 2008-04-09 10:39 |只看该作者
这样也可以,多谢,
我以为  gsm 中的 s m 没法一起用呢.
我再去看看"动态正则式"

论坛徽章:
0
6 [报告]
发表于 2008-04-09 10:51 |只看该作者
http://www.regexlab.com/zh/regref.htm
这里有属性说明

表达式属性
说明

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

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

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

①xxxxxxxxx②\n
③xxxxxxxxx④

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

Global
主要在将表达式用来替换时起作用,配置为 Global 表示替换所有的匹配。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP