[英]Regex to not match if string encountered in middle of pattern
我有以下正则表达式,用于查找我需要解析的文件区域:
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
等)和一行开始的区域. userdata
. 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
很Regex
所以我可能做错了):
(?<Shape>rect|frect|fpie|spline|poly|line|fsec|fcir).+?(?!rect|frect|fpie|spline|poly|line|fsec|fcir)userdata\s\".*?attr=(?<AttributeType>\w+)\^(?<AttributePropertyString>.*?)\^(?=(?:END_FOXV))
这可能吗? 如果是这样,请您指出正确的方向,如果没有,请告诉我,我会尝试不同的方法。
重点是.+?
尽可能少地匹配任何 1+ 个字符,但从{GetShapeOrRegexSnippet}
的第一个匹配项{GetShapeOrRegexSnippet}
。 这就是为什么它可以跨多个块匹配。
替换第一个.+?
使用(?:(?!{GetShapeOrRegexSnippet}|action=).)*
,一个温和的贪婪标记,只会匹配 0+ 个字符,这些字符不开始与{GetShapeOrRegexSnippet}
或action=
匹配的序列。
也许我不明白你的问题,但你不能把整个部分(我猜是userdata
块)包装在括号中并放一个?
之后呢? 这将匹配该块的零个或一个实例。 像这样的东西(只显示了userdata
的正则表达式的块):
(?:userdata\s"".*?action=(?<ActionType>\w+)\^(?<ActionPropertyString>.*?)\^\"")?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.