如果在模式

时间:2017-01-31 14:02:50

标签: c# regex

我有以下正则表达式,用于查找我需要解析的文件区域:

public static readonly Regex ObjectAction = new Regex($@"(?<Shape>{GetShapeOrRegexSnippet}).+?userdata\s"".*?action=(?<ActionType>\w+)\^(?<ActionPropertyString>.*?)\^\""", RegexOptions.Singleline);

其中GetShapeOrRegexSnippet由:

定义
private static string GetShapeOrRegexSnippet => ShapeCodes.Aggregate((i, j) => i + '|' + j);

匹配遇到我的收藏中的ShapeCodes之一(rectcircline等)之间(和包括)之间的区域以及以{{开头的行1}}。这适用于形状良好的部分,例如:

. userdata

但是,给定的形状完全有可能没有关联的line \ 16.5894 34.4828 34.8993 46.3054 19.6616 41.3793 \ 11.6741 44.9507 . filled 1 . dynprop \ (FOX_VAR_3 \ (= * \ (ecolor FOX_VAR_3))) \ (o2 \ (= * \ (call fox_oos(__self)))) . userdata "FOX_VAR=3^attr=ECOLOR^attrval=3^required=0^var=UPDATETAG33^delta=1.000000^conv=LOOKUP^type=LONG^minstate=0^num_entries=2^entries=7,7^END_FOXV= ^oos_obj=0002" 字符串,因此可以规定如果userdata再次遇到任何Regex它遇到一个ShapeCodes字符串,它与该部分不匹配,并将继续检查文件的其他内容?

我最初的想法是使用否定的前瞻,但这不起作用(我对userdata很新,所以我可能做错了):

Regex

这可能吗?如果是的话,请你指点我正确的方向,如果没有,请你告诉我,我会尝试不同的方法。

2 个答案:

答案 0 :(得分:2)

重点是.+?匹配任何1个字符尽可能少,来自{GetShapeOrRegexSnippet}的第一个匹配。这就是为什么它可以匹配几个块。

将第一个.+?替换为(?:(?!{GetShapeOrRegexSnippet}|action=).)*,这是一个驯化的贪婪令牌,只会匹配0 +字符,这些字符不会启动与{GetShapeOrRegexSnippet}action=匹配的序列。

答案 1 :(得分:0)

也许我不理解你的问题,但是你不能把整个部分(我想这是userdata块)包裹在parens中并在它之后放一个?吗?这将匹配该块的零个或一个实例。像这样的东西(只显示正则表达式的userdata块):

(?:userdata\s"".*?action=(?<ActionType>\w+)\^(?<ActionPropertyString>.*?)\^\"")?