2013-04-08 21 views
5

私はboost::regex::regex_matchに問題があります。私はBOOST_REGEX_MATCH_EXTRAをオンにして作業します。ブースト正規表現。 2つの部分の名前付きグループ


私が持っているもの:

string input1= "3 4 5"; 
string input2= "3 4 7"; 

私が取得したいどのような(これは私の問題の単純な例ではなく、実際の作業です):

list output1= [3 4 5]; 
list output2= []; //not matched 

正規表現:what["group"]=5what["group"].captures()= [3, 4, 5]

OUTPUT2:not matched

P

((?<group>[0-6])[ ]?)* 

OUTPUT1(これは大丈夫働いています)問題は:

私はより多くの1つのグループに正規表現の部分からデータを収集する必要があります。

は、私が試した:

((?<group>[0-6])[ ])*(?<group>[0-6]) 

OUTPUT1:what["group"]=4

OUTPUT2 what["group"].captures()=[3, 4]not matched

[OK]を、私は理解しています。グループの2番目の宣言は見られません。

は、私が試した:

((?<group>[0-6])[ ])*(?&group) 

OUTPUT1:what["group"]=4what["group"].captures()= [3, 4, 4]

OUTPUT2:not matched

  • しかし、これは何?どこから2番目の4番ですか?最初の例は一致しますが、2番目の例は一致しないため、「グループ」パターンがチェックされます。しかし、それは新しいものを保存するのではなく、最後に見つかった価値を2倍にします。どうして?たぶん私はいくつかのフラグをオンにするのを忘れましたか?
  • 正規表現の異なる部分から1つのグループのデータを取得する別の方法はありますか?

私は1つのグループ、より多くを持っているので、token_iteratorは私を助けることができません。

そして、式は設定ファイルで設定する必要があります。静的Xpressiveは使用できません。

+1

いいえ、あなたは1つのキャプチャグループにターゲット文字列の2つの異なる部分を詰め込むことができない - 少なくともないもの間、すべてをキャプチャせず。 –

答えて

0

これは私があなたの問題をどう解釈するかである:これは正規表現では不可能である Total price: $1,234

、あなたは(カンマなし)1234としてコストをキャプチャしたい

文字列グループを捕らえて途中のパーツを除外する方法がないためです。つまり、2つのマッチグループと先読みを使用して、内部コードをグループにまとめることができます。あなたは、カンマがあるかどうか分からない場合は、上記の例を使用していないか(1から5000からすなわち価格帯)あなたは、1-3の数字と一致する

Total price: \$(?P<price>\d{1,3})(?:(?=\,),(?P<price2>\d{3})|)

ような何かを行うことができますカンマを探し、存在する場合は別の名前のグループを使用して2番目のチャンクに一致させます。ここで

は、正規表現のテストのための本当に素晴らしいリソースです:www.regex101.com

+0

もちろん、私は加算コードでこれを行うことができます。さらに、追加コードを使うと、正規表現なしでこれを行うことができます。しかし、私は設定ファイルに正規表現を保存したい。しかし、そのような追加コードを作成することはあまり簡単ではありません。これはANY UNKNOWN正規表現で動作します。私はどれくらいのグループ(価格、価格2、価格3 ...)があるか、どの順序であるかはわかりません – Darida

+0

@ダリダ私は今も同様のケースで取り組んでいます。私の現在の解決策は、構成ファイルで正規表現パターンだけでなく、「値の説明」も保持するということです。基本的には、グループ名と任意の文字列を取り込むシーケンスです。コードは文字列とパターンをマッチングし、成功した場合は、前述のキャプチャグループを連結した "値の説明"とこれまでに指定されたものを基に実際の値を構築します。これにより、固定コードを残したまま、構成ファイルに合理的な柔軟性を持たせることができます。 –

関連する問題