簡體   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