我正在尝试解析一个类型的属性(例如,“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选项。
答案 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 Type
和DOTALL
标记,以便您可以匹配多行。在这场比赛中,您需要小组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
的组与相应的属性类型匹配。
这是现场演示: