2

次の結果が得られる正規表現を実行しようとしています。

文章:

[Add Months([Actual Date], 5)] - 別のテキスト - [実際の日付] - [Cria ocorrencia padrao.Record.Name] - 別のテキスト - [Add Months([実際の日付], 5, [実際の日付]) ] - [Add Months(Add Days(AddDays([実際の日付], 5), 7), 5, [実際の日付])] - 最終テキスト

望ましい出力:

Match 1: [Add Months([Actual Date], 5)]
Match 2:  - Another Text - 
Match 3: [Actual Date]
Match 4:  - 
Match 5: [Cria ocorrencia padrao.Record.Name]
Match 6:  - Another Text - 
Match 7: [Add Months([Actual Date], 5, [Actual Date])]
Match 8:  - 
Match 9: [Add Months(Add Days(AddDays([Actual Date], 5), 7), 5, [Actual Date])]
Match 10: - final text

しかし、私には成功がなく、このタスクを実行する必要があります。

この正規表現を使用して、.Netでネストされたパターン正規表現を使用しようとしています:

string pattern = @"(([^\[\]]*)??)|(\[(?>\[(?<DEPTH>)\](?<-DEPTH>)|.?)*(?(DEPTH)(?!))\])?([^\[\]]*)";

しかし、機能していません。誰かが私に光を与えることができますか?

ありがとうございました。

4

2 に答える 2

3

バランシング グループを使用する通常の方法は次のとおりです。

\G
(?:
  [^\[\]]+
|
  \[
  (?>
    [^\[\]()]
  |
    (?<Depth>[(\[])
  |
    (?<-Depth>[)\]])
  )*
  (?(Depth)(?!))
  \]
)

動作デモ。

私がそこにたどり着いた方法の詳細な説明については、この投稿を参照してください。あなたの場合、すべての一致が隣接していることを確認するためにアンカーを追加し\G、最初の代替が誤って括弧の内容を取得しないことに注意してください。

あなたのパターンを本当に解読できないことを申し訳ありません-フリースペース(または .NET RegexOptions.IgnorePatternWhitespace)は非常に役立ちます。

入力が常に正しくネストされていることがわかっている場合は、これで十分です。入力にエスケープされた括弧/括弧または誤ってネストされた括弧/括弧が含まれる可能性がある場合、このパターンは望ましくない結果をもたらし、正しい括弧を常に閉じるようにするために、もう少し努力する必要があります。(リンクされたデモの 2 行目を参照してください。内側の括弧は間違った順序で閉じられていますが、それでも一致しています。)

できることは次のとおりです。開始ブラケットに遭遇するたびに、開始ブラケット自体ではなく、対応する終了ペンダントをキャプチャ スタックにプッシュします。文字列のどこにいるかを台無しにしないように、先読みでこれを行うことができます。次に、現在の文字が対応する文字と一致する場合にのみ、深度カウンターを減らします (単純な後方参照を使用)。

\G
(?:
  [^\[\]]+
|
  \[
  (?>
    [^\[\]()]
  |
    [(](?=.*(?<Close>[)]))
  |
    \[(?=.*(?<Close>\]))
  |
    (?<-Close>\k<Close>)
  )*
  (?(Close)(?!))
  \]
)

ワーキングデモ

もちろん、これはまだエスケープを処理しません。

于 2013-08-09T18:36:57.870 に答える
0

私の問題を解決するパターンを見つけました:\[(?>\[(?<DEPTH>)|\](?<-DEPTH>)|.?)*(?(DEPTH)(?!))\]|([^\[\]]*)

このテキスト: [Add Months([Actual Date], 5)] - 別のテキスト - [実際の日付] - [Cria ocorrencia padrao.Record.Name] - 別のテキスト - [Add Months([実際の日付], 5, [ Actual Date])] - [Add Months(Add Days(AddDays([Actual Date], 5), 7), 5, [Actual Date])] - 最終テキスト

私を返します:

Match 1: [Add Months([Actual Date], 5)]
Match 2:  - Another Text - 
Match 3: [Actual Date]
Match 4:  - 
Match 5: [Cria ocorrencia padrao.Record.Name]
Match 6:  - Another Text - 
Match 7: [Add Months([Actual Date], 5, [Actual Date])]
Match 8:  - 
Match 9: [Add Months(Add Days(AddDays([Actual Date], 5), 7), 5, [Actual Date])]
Match 10: - final text
于 2013-08-09T18:48:17.653 に答える