1

以前のSOの質問から提供された便利な正規表現があります:

$regex = qr/
    (sp\s+              #start with 'sp'        
    \{                  #opening brace
      (                 #save to $2
         (?:            #either
            \{ (?-1) \} #more braces and recurse
            |           #or
            [^{}]++     #non-brace characters
         )*             #0 or more times
      )                 #end $2
    \}                  #ending brace
    )                   #end $1
    /x;

私はそれを使用して、ファイルからテキスト構造を抽出します。これはsp {}、中括弧をさらにネストできる可能性があります。次のテキストを $1 に正しく保存します。

sp {foo {bar} baz}

しかし、私は問題に遭遇しました: 引用. 私が持っているテキストでは、垂直バーを使用して引用できます。

sp {foo |}}}}bar}}}{{|}

その全体が 1 つの構造ですが、私が持っている現在の正規表現はsp {foo |}. バックスラッシュを使用して引用符内で垂直バーをエスケープできるため、問題はさらに複雑になります。

sp {foo |}\|bar|}

も一致する必要があります。引用符と引用符のエスケープを処理するためにこの正規表現を強化する方法について誰か考えがありますか?

4

2 に答える 2

1

交換

[^{}]

(?: [^|{}]++
|   \| (?: [^\\|]++ | \\. )*+ \|
)
于 2012-10-05T18:50:19.987 に答える
1

Text::Balanced のような CPAN モジュールを見てください。

于 2012-10-05T18:48:44.993 に答える