繁体   English   中英

如果在模式中间遇到字符串,则正则表达式不匹配

[英]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);

这匹配(包括)遇到我的集合中的一个ShapeCodesrectcircline等)和一行开始的区域. 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弦,它就会不匹配节,并且将继续检查文件的其他?

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

(?<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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM