2017-07-18 7 views
-2

大括弧で囲まれていない最初のパイプ文字まですべてを抽出しようとしている次の行があります。 PCRE Regex - 大括弧で囲まれていない最初のパイプにすべて一致する

action=search sourcetype=audittrail [ localop | stats count | eval search_id = replace("$top10_drilldown_sid$", "^remote_[^_]*_", "") | table search_id ] [ localop | stats count | eval earliest = $top10_drilldown_earliest$ - 86400 | table earliest ] latest="$top10_drilldown_latest$" | stats values(savedsearch_name) AS search_name 

予想される出力:

action=search sourcetype=audittrail [ localop | stats count | eval search_id = replace("$top10_drilldown_sid$", "^remote_[^_]*_", "") | table search_id ] [ localop | stats count | eval earliest = $top10_drilldown_earliest$ - 86400 | table earliest ] latest="$top10_drilldown_latest$" 

すなわちすべてが、いくつかの前後参照例次| stats values(savedsearch_name) AS search_name

を末尾に、私は(ほぼ)私はJavaScriptの正規表現式

を使用して必要なものを得ることができます/.*\|(?![^\[]*\])/g - http://refiddle.com/refiddles/596dec4c75622d608f290000

しかし、これはうまく機能していたPCRE互換の式には変換されませんでした(さらに、最初のパイプまで含めてすべてをキャプチャしたい)。

私が読んだところでは、最初の括弧で囲まれたセットのネストされた大括弧は回避できない複雑な問題ですか?唯一のいずれかの指定されたセットの中でネストされた括弧の1つのレベル(例えば[..[]..]または[..[]..[]..]

は、私は私が正&負の前後参照の周りに完全に私の頭を持っているとは思わないことを認めるが、任意のヘルプは大幅だろうがあるでしょう感謝!このような状況では、すべてと一致するように、より効率的な

+0

ブラケットのバランスが取れていることがわかっている場合は、['^(?:(^)|] ++ |(?1))*])| [^ |])+ \ K \ | '](https://regex101.com/r/6ZJpqN/1)。しかし、そうである必要はありません、あなたの文字列に '\]'が含まれているかもしれません。 –

+0

ありがとう@WiktorStribiżew - これは私のための新しいコンセプトの多くです。私はそれの周りに私の頭を取得しようとします。あなたが送った例を見て、私は私が得ることを期待していたものを含めなかったことを実感します。私は今それを編集します。 – Arrjo

+0

['\ K \ |'を削除](https://regex101.com/r/6ZJpqN/2) –

答えて

0

をだ分割しようとするよりも、区切り文字ではありません。

(?=[^|])[^][|]*(?:(\[[^][]*+(?:(?1)[^][]*)*+])[^][|]*)* 

demo

詳細:

(?=[^|]) # lookahead: ensure there's at least one non pipe character at the 
     # current position, the goal is to avoid empty match. 
[^][|]* # all that isn't a bracket or a pipe 
(?: 
    ( # open the capture group 1: describe a bracket part 
     \[ 
     [^][]*+ # all that isn't a bracket (note that you don't have to care 
       # about of the pipe here, you are between brackets) 
     (?: 
      (?1) # refer to the capture group 1 subpattern (it's a recursion 
        # since this reference is in the capture group 1 itself) 
      [^][]* 
     )*+ 
     ] 
    ) # close the capture group 1 
    [^][|]* 
)* 

あなたの場合空の部分も必要ですが、次のように書き直すことができます:

(?=[^|])[^][|]*(?:(\[[^][]*+(?:(?1)[^][]*)*+])[^][|]*)*|(?<=\|) 
+0

偉大な内訳ありがとうございます - 私はこれを試してみましょう:-) – Arrjo

+0

@Arrjo:ページをリフレッシュして、私はタイプミス(今修正)しました。 –

関連する問題