我有以下正则表达式,用于查找我需要解析的文件区域:
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
之一(rect
,circ
,line
等)之间(和包括)之间的区域以及以{{开头的行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
这可能吗?如果是的话,请你指点我正确的方向,如果没有,请你告诉我,我会尝试不同的方法。
答案 0 :(得分:2)
重点是.+?
匹配任何1个字符尽可能少,但来自{GetShapeOrRegexSnippet}
的第一个匹配。这就是为什么它可以匹配几个块。
将第一个.+?
替换为(?:(?!{GetShapeOrRegexSnippet}|action=).)*
,这是一个驯化的贪婪令牌,只会匹配0 +字符,这些字符不会启动与{GetShapeOrRegexSnippet}
或action=
匹配的序列。
答案 1 :(得分:0)
也许我不理解你的问题,但是你不能把整个部分(我想这是userdata
块)包裹在parens中并在它之后放一个?
吗?这将匹配该块的零个或一个实例。像这样的东西(只显示正则表达式的userdata
块):
(?:userdata\s"".*?action=(?<ActionType>\w+)\^(?<ActionPropertyString>.*?)\^\"")?