主页
文章
交流
项目
购买
客服

 

想了好长时间没有想出来的问题

欢迎讨论 » 表达式交流 » 想了好长时间没有想出来的问题 »


   

想了好长时间没有想出来的问题
发表:smartphone,2010-6-9 17:59:46

回复

 
我想取namespace 括号里面所有的内容

namespace\s*(\S*\s*)\{([\S\s]+)\}

用这个表达式不能区分,请问怎么样才能取到两个namespace里面所有的内容

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WindowsFormsApplication1
{
    class Class1
    {
    }

    class Class2
    {

    }
}

namespace ttt
{
    class Class1
    {
    }

    class Class2
    {

    }
}

   

Re: 想了好长时间没有想出来的问题
发表:史寿伟,2010-6-10 10:18:55

回复

 
你这个问题是比较复杂的,
如果采用贪婪模式,会导致越过多个 namespace;
如果采用勉强模式,会导致中间的 {} 干扰。

因此需要采用“递归”的思路。如果你使用的正则环境支持递归表达式,那就可以支持很好。如果不支持递归,那就只能支持‘有线层次\’的括号,比如:

namespace[^{}]*\{(\{(\{(\{(\{(\{[^{}]*\}|[^{}])*\}|[^{}])*\}|[^{}])*\}|[^{}])*\}|[^{}])*\}

   

Re: 想了好长时间没有想出来的问题
发表:smartphone,2010-6-10 10:50:39

回复

 
非常感谢史老师!我现在用的是c#,是支持递归表达式的,我用递归表达式为:
namespace\s*(?<namespace>\S*\s*) 和 \{(?<sourcecode>(?:[^{}]|(?R))*)\} 可以分别匹配,但是 为什么连起来 namespace\s*(?<namespace>\S*\s*)\{(?<sourcecode>(?:[^{}]|(?R))*)\} 不能匹配,百思不得其解,还望老师指点迷津。

   

Re: 想了好长时间没有想出来的问题
发表:史寿伟,2010-6-10 11:05:12

回复

 
(?R) 是对整个表达式的递归引用。因为你 { } 内部不会再出现 namespace 所以失败。不知道 .NET 是否支持对部分表达式的递归引用,比如 (?R1) 之类。

理解这个问题点之后,你自己在找找办法。


第 1 页,共 1 页: 第一页 上一页 下一页 最后一页


相关赞助商链接

 
 

RegExLab.com © 2005 - 2009  渝ICP备05015140号