2017-01-31 12 views
2

の途中で遭遇した文字列は、私は私が解析する必要があるファイルのある領域を見つけるために使用され、次の正規表現があれば正規表現が一致しないために:パターン

GetShapeOrRegexSnippetがで定義され
public static readonly Regex ObjectAction = new Regex([email protected]"(?<Shape>{GetShapeOrRegexSnippet}).+?userdata\s"".*?action=(?<ActionType>\w+)\^(?<ActionPropertyString>.*?)\^\""", RegexOptions.Singleline); 

. userdata始まる私のコレクション( rectcirclineなど)と行の ShapeCodesの一つに遭遇(を含む)の間の領域に一致する
private static string GetShapeOrRegexSnippet => ShapeCodes.Aggregate((i, j) => i + '|' + j); 

。しかし、所定の形状は、関連するuserdata文字列を持っていない可能性がありますように、それはRegexのいずれかに遭遇した場合ことを規定することが可能であることが完全に可能である

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" 

:これは、同様に形成セクションのために正常に動作しますShapeCodesuserdata文字列が出現する前に再びそのセクションに一致し、ファイルのelseをチェックし続けますか?

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

これが可能である:(私は私も何か間違ったことをやっている可能性がRegexに非常に新しいです)

私の最初の考えは否定先読みを使用していたが、これは動作しませんか?もしそうなら、正しい方向に私を向けることができますか?もしそうでなければ、私に知らせてください。私は別の方法を試みます。

+0

最初の '。+? 'を'(?:(?!{GetShapeOrRegexSnippet} | action =)。*) 'に置き換えます。 –

+0

@WiktorStribiżewこれは、おかしなことをするようだ!答えとして書くと –

答えて

2

点は.+?{GetShapeOrRegexSnippet}の最初の一致からとして、できるだけ少ないが、任意1+文字と一致することです。そのため、いくつかのブロックで一致する可能性があります。

(?:(?!{GetShapeOrRegexSnippet}|action=).)*との最初の.+?を交換し、唯一0+ {GetShapeOrRegexSnippet}action=と一致するシーケンスを開始していない文字にマッチします鍛え貪欲トークン、。

0

私はあなたの質問を理解していないかもしれませんが、括弧内にセクション全体(おそらく、それはuserdataブロックだと思います)をラップして、?を置くことはできませんでしたか?これは、そのブロックのインスタンスが1つでも1つでも一致します。 (単に正規表現のuserdataブロックを示す)のようなもの:

(?:userdata\s"".*?action=(?<ActionType>\w+)\^(?<ActionPropertyString>.*?)\^\"")? 
+0

これはうまくいかないようですが、次のシンボルのセクションが基本的に始まる前にユーザーデータ文字列がある場合にのみ一致させたいからです: rect/ ..... ..... 。ユーザデータ... が一致するだろうが: ライン/ .... .... RECT は一致しません、と検索がrect' 'から続けるだろう。検索には、これらのブロックがいくつかあります。 –