0

文字列の解析で問題が発生したため、正規表現で解決したいと考えています。常に入力として、次のような文字列を取得します: %function_name%(IN: param1, ..., paramN; OUT: param1,..., paramN)

私はパターンを書いています:

string pattern = @"[A-za-z][A-za-z0-9]*\(IN:\s*(([A-za-z][A-za-z0-9](,|;))+|;)\s*OUT:(\s*[A-za-z][A-za-z0-9],?)*\)";

このパターンは入力文字列を検出しましたが、実際には出力として文字列の 2 つの配列が必要です。このうちの 1 つには INPUT パラメータ (「IN:」の後) が含まれIN: param1, ..., paramNている必要があり、2 番目の配列には出力パラメータの名前が含まれている必要があります。Params には数字と「_」を含めることができます。

実際の入力文字列の例:

Add_func(IN: port_0, in_port_1; OUT: out_port99)

Some_func(IN:;OUT: abc_P1)

Some_func2(IN: 入力ポートA;OUT:)

正しいパターンの作り方を教えてください。

4

3 に答える 3

1

これを行う方法は、キャプチャ グループを使用することです。名前付きキャプチャ グループは、最も簡単に操作できます。

// a regex surrounded by parens is a capturing group
// a regex surrounded by (?<name> ... ) is a named capturing group
// here I've tried to surround the relevant parts of the pattern with named groups
var pattern = @"[A-za-z][A-za-z0-9]*\(IN:\s*(((?<inValue>[A-za-z][A-za-z0-9])(,|;))+|;)\s*OUT:(\s*(?<outValue>[A-za-z][A-za-z0-9]),?)*\)";

// get all the matches. ExplicitCapture is just an optimization which tells the engine that it
// doesn't have to save state for non-named capturing groups
var matches = Regex.Matches(input: input, pattern: pattern, options: RegexOptions.ExplicitCapture)
    // convert from IEnumerable to IEnumerable<Match>
    .Cast<Match>()
     // for each match, select out the captured values
    .Select(m => new { 
        // m.Groups["inValue"] gets the named capturing group "inValue"
        // for groups that match multiple times in a single match (as in this case, we access
        // group.Captures, which records each capture of the group. .Cast converts to IEnumerable<T>,
        // at which point we can select out capture.Value, which is the actual captured text
        inValues = m.Groups["inValue"].Captures.Cast<Capture>().Select(c => c.Value).ToArray(),
        outValues = m.Groups["outValue"].Captures.Cast<Capture>().Select(c => c.Value).ToArray()
    })
    .ToArray();
于 2013-08-19T12:48:30.633 に答える