次のような式の一致およびキャプチャ演算子とオペランドが必要です。
- 1
- バツ
- 1 + ×
- x + y + 3 + 10
- 等...
したがって、正規表現では、
(\w+)(\s*([+])\s*(\w+))*
それを行うように見えますが、一致したキャプチャを取得するにはどうすればよいですか? [+] と (\w+) は既に 1 つのキャプチャにあることに注意してください。
次のような式の一致およびキャプチャ演算子とオペランドが必要です。
したがって、正規表現では、
(\w+)(\s*([+])\s*(\w+))*
それを行うように見えますが、一致したキャプチャを取得するにはどうすればよいですか? [+] と (\w+) は既に 1 つのキャプチャにあることに注意してください。
残念ながら、これは不可能です (少なくとも、私が知っている正規表現では)。1 つのキャプチャ グループが複数回使用された場合、キャプチャは常に最後にキャプチャしたもので満たされます。簡単な例:([a-z])*
に適用するabc
と、 のみが得られますc
。
有効な形式を確認するためだけに正規表現を使用することをお勧めします。次に、の一致で文字列を分割できます\s*\b\s*
。これにより、最後の例の, , x
, +
, ,を含む配列が得られます。y
+
3
+
10
を使用して正規表現を使用して文字列を分割する方法を示すコード例を次に示しますboost::regex
。
boost
がオプションの場合は、フラグを使用boost::regex
して使用でき、キャプチャされたすべてのアイテムのリストが含まれますboost::match_extra
match_results::captures
sub_match::captures
おそらく、これは正規表現よりもSystem.CodeDom.Compilerにとってより良い仕事になるでしょう。