2017-03-21 15 views
1

1つの正規表現が渡された後に値を取得したい。サンプルでは、​​私がFirstValSecondValをつかむしたい正規表現の1回のパスの後に2番目の正規表現を評価する

My test string is ##[FirstVal][SecondVal]## 

です。

私は\#\#(.*?)\#\#パターンを試しましたが、返信するのは[FirstVal][SecondVal]です。

1つの正規表現の結果を評価し、別の正規表現を適用できますか?

+0

これには回避策がありますが、正規表現の味は何ですか? C#でCaptureCollection、PCREなどで簡単に行うことができます。カスタム境界を設定するために '\ G'演算子を使用できます。 –

+0

@RomanPerekhrest:文字列## [FirstVal] [SecondVal] ##のFirstValとSecondValを一致させたい。 –

+0

@WiktorStribiżewは、C#で例を挙げることができます。私はC#に精通しています。 –

答えて

1

を印刷し

import re 
data = "##[FirstVal][SecondVal]##" 
x = re.search(r'##\[(\w+)\]\[(\w+)\]', data) 
print(x.groups()) 

、あなたはすべての繰り返しキャプチャをつかむために、キャプチャ・スタックを使用することができます。

正規表現のような

##(?:\[([^][]*)])+## 

##を見つけるだろうし、一致すると[ + texts-with-no-brackets + ]と、これらすべてのtexts-with-no-bracketsは、キャプチャグループに関連付けられているCaptureCollectionにプッシュされます。1.

を参照してくださいのような文字列の任意の量をキャプチャC#のでregex demo online

enter image description here

、あなたは以下を使用しますINGのコード:

var s = "My test string is ##[FirstVal][SecondVal]##"; 
var myvalues = Regex.Matches(s, @"##(?:\[([^][]*)])+##") 
     .Cast<Match>() 
     .SelectMany(m => m.Groups[1].Captures 
      .Cast<Capture>() 
      .Select(t => t.Value)); 
Console.WriteLine(string.Join(", ", myvalues)); 

あなたはPythonのは、PyPI regexモジュールa similar thingを行うことができますC# demo

マインドを参照してください。

0

モジュールが多少異なる可能性があるため、使用しているプログラミング言語に違いがあります。あなたが使用している言語を指定していないので、Pythonを私のソリューションに使用しました。そして、両側に#を2つ使用し、エスケープ文字を使用して正方形の中括弧に一致しない正規表現を作成することができます(\[(\w+)\] 。どこのpythonの再で\w、モジュールはa-zA-Z0-9_ための外延を表します。.NETでは('FirstVal', 'SecondVal')

+0

全く動作しません。結果として '## [FirstVal] [SecondVal] 'を返します。 –

+0

私のソリューションは** Python 3.x **で完璧に動作しますが、あなたの正規表現がどのように動作するかはわかりません。 –