2017-04-24 1 views
0

私は正規表現グループのキャプチャを使用して、bashのCURLコマンドのすべてのヘッダを取得しようとしているが、私はそれだけで1つのグループ内のすべてのヘッダーをつかんだ問題を抱えている(別なぜ私はそれが起こっているのか正確にはわからないグループ)。正規表現グループとのCURLから個々のヘッダを取得

のbash:

curl '<url>' -H 'origin: <url>' -H 'accept-endocing: <...>' -H 'accept-language: <...>' <continues with more headers> --data '<...>' 

、それは他のヘッダと続きます。

コード:

var rawBash = RawBash.Text; 
var headerPattern = @"\-H[\s][\']{1}(.+)[\']{1}"; 
var headers = Regex.Match(rawBash, headerPattern); 

私はtested the pattern hereをしましたし、それが「11のキャプチャ」と言うと、「正しく」私は撮影したいグループを示しますが、私は、コードをデバッグするとき、それは2グループが捕獲されたことを示し、 :

  1. 全体のカールが始まる最初の "-H" で始まる全体CURL "起源:"

何が起こっているのですか?私は正規表現が(.+)を取り、それが[\']{1}'ため、試合(.+)に当たったときに終了していない推測している...しかし、どのように私はそれがグループ内の個々のヘッダをキャプチャするのですか?

私はいくつかのC#RegExチュートリアル/説明を読み込もうとしましたが、私が探しているものを見つけることができませんでした(または私が正しい言葉で探しているものを説明していません)。

EDIT:グループは今([^\']+)代わりの(.+)ある

var headerPattern = @"\-H[\s][\']{1}([^\']+)[\']{1}"; 

お知らせ:文字通り秒投稿した後、私は、このパターンをしようとする考えを持っていました。それは今私が望むように働いています。

また、私はRegex.Match(...)を使用しています、そして、それはすべての一致を得るためにRegex.Matches(...)でなければなりません。

しかし、私はまだまだ立っています。どのようにして、ある時点でグループキャプチャを終了できますか?私は同様の状況だったと信じているところで、forward lookupという用語を使っている友人を思い出していますが、実装する方法はわかりません。あなたが見ている何

答えて

1

は怠惰な(または非欲張り)マッチング対貪欲の影響です。

貪欲なマッチングが必要とされるだけのように多くの文字にマッチします可能 レイジーマッチングのように多くの文字にマッチします。あなたのオリジナルのパターン(.+)

は、一つ以上の貪欲マッチングや任意の文字です。だから、それはあなたが([^\']+)、それを変え何最後'

-H '最初からつかむだろう、また貪欲であるが、そのは、'ていない唯一のマッチング文字を任意の文字に一致しないので、その早い終了します。

*または+を遅れて変更するには、?を直後に追加します。

ヘッダーマッチャーへの私の解決策は、(あなたの例の文字列が一貫した形式をかなり代表していると仮定して)です。

\-H\s+\'(.+?)\' 

あなたの友人は肯定的な先読みを指しています。これは、文字列の中で成功した一致を得るために見えますが、一致するものは完全一致文字列の一部ではありません。構文は(?=...)です。また、陰性の先読み(?!...)と、正と負のlookbehind、(?<=...)(?<!...)がそれぞれあります。長い文字列では本当に効率的なので、注意して使用する必要があります。

regex (is.*) always (the right answer(?=.*this will match)) 

は、最初の文字列のために、このになります:私は、次のパターンを使用する場合

regex isnt always the right answer|this will match 

regex isnt always the right answer|this will not 

:たとえば

は、次の2つの文字列を取る

Full match 0-34 `regex isnt always the right answer` 
Group 1. 6-10 `isnt` 
Group 2. 18-34 `the right answer` 

をし、 2番目のものとまったく一致しません。

+0

すばらしい、返信いただきありがとうございます!私が正しく理解しているならば、 '? 'は基本的に前の' 0 + '/' 1 + 'に' 0 || 1'を実行して最小の一致を保証するので、怠惰です。 – Daevin

+0

'?'は怠惰な繰り返し文字を行うための構文です - http://www.regular-expressions.info/repeat.html –

関連する問題