用单个文本绑定多个匹配

时间:2012-02-13 20:09:15

标签: regex

我正在尝试解析一个类型的属性(例如,“Cusip”,“Issuer”和“Coupon”等字样),如下所示:

Public Type GetPricesResponse
    Cusip          As String
    Issuer         As String
    Coupon         As String
End Type

正则表达式([a-zA-Z0-9]+).+As适用于此代码段(请参阅http://regexr.com?300fl),但在与大量代码混合时可能无法正常工作。所以,我试图用正面的单词Public Type“绑定”这个正则表达式,最后用End Type来明确标识我需要的内容如下:

Public\sType\s([a-zA-Z0-9]+).+As.+End\sType

......但当然它与任何东西都不匹配。

我也设置了MultiLine选项。

2 个答案:

答案 0 :(得分:1)

你提出了两个不同的问题。

首先,粗略地说,“我可以写一个正则表达式来匹配这个东西”,答案是肯定的。为简单起见,我使用\w代替[a-zA-Z0-9]

Public\s+Type\s+(\w+)\s+((\w+)\s+As\s+(\w+)\s*('.*\s*)?)+End\s+Type

接下来是“我如何解析属性”,答案就是,如评论中所写:不要使用单个正则表达式。首先,使用仅捕获定义的正则表达式:

Public\s+Type\s+\w+\s+(.*?)End\s+Type

这使用了一个不情愿的量词*?,因此正则表达式不会吞噬End TypeDOTALL标记,以便您可以匹配多行。在这场比赛中,您需要小组1并反复find以下内容:

^\s+(\w+)\s+.*$

此匹配中的群组1将是您的媒体资源名称。

答案 1 :(得分:0)

使用以下正则表达式来匹配整个事物:

Public\s+Type\s+(?<tname>[\w]+)\s+((?<pname>[\w]+)\s+As\s+(?<ptype>[\w]+)\s+)+End\s+Type

请注意,它使用命名组来更轻松地访问匹配的内容。因此,在匹配整个内容后,名为tname的组与类类型匹配,名为pname的组与属性名称匹配,名为ptype的组与相应的属性类型匹配。

这是现场演示:

http://regexr.com?300l0