[英]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.