3

次のような文字列があるとしましょう:

string = [+++[>>[--]]]abced

今、私は何らかの形で次のリストを返したいと思っています: [[--],[>>],[+++]]. これは、最も深い[ネストとそれに続く他のネストの内容です。私はこのような解決策を思いつきました:

def string = "[+++[>>[--]]]"
loop = []
temp = []
string.each {
    bool = false
    if(it == "["){
        temp = []
        bool = true
    }
    else if( it != "]")
        temp << it 
    if(bool)
         loop << temp

}
println loop.reverse()

しかし、これは実際にabcedは最後の文字列の後に文字列を取り]、結果に入れます!. でも欲しいのはただ[[--],[>>],[+++]]

これを解決するグルーヴィーな方法はありますか?

4

3 に答える 3

2

再帰を使用してもかまわない場合は、これを使用できます

def sub(s , list){
    if(!s.contains('[') && !s.contains('[')) 
        return list
    def clipped = s.substring(s.lastIndexOf('[')+1, s.indexOf(']'))
    list.add(clipped)
    s = s - "[$clipped]"
    sub(s , list)
}

通話中

sub('''[+++[>>[--]]]abced''' , [])

中括弧で囲まれたすべてのサブ部分のリストを返します。

['--', '>>', '+++']
于 2012-08-22T07:51:46.210 に答える
0

ブラケットが対称である場合は、ブラケットのネストの深さを保持するカウンター変数を導入するだけで済みます。0を超える深度レベルのみが出力で許可されます。

def string = "[+++[>>[--]]]abc"
loop = []
temp = []
depth = 0;
string.each {
  bool = false
  if(it == "["){
    temp = []
    bool = true
    depth++;
  }   
  else if (it == "]"){
    depth--;
  }   
  else if (depth > 0){ 
    temp << it  
  }   
  if(bool){
    loop << temp
  }   
}
println loop.reverse()
于 2012-08-22T06:53:26.213 に答える
0
class Main {

    private static final def pattern = ~/([^\[]*)\[(.+?)\][^\]]*/

    static void main(String[] args) {
        def string = "[+++[>>[--]]]abced"

        def result = match(string)
        println result

    }

    static def match(String val) {
        def matcher = pattern.matcher(val);

        if (matcher.matches()) {
            return matcher.group(1) ? match(matcher.group(2)) + matcher.group(1) : match(matcher.group(2))
        }
        [val]
    }
}

System.out

[--, >>, +++]

正規表現パターンの最初のグループのキャプチャは、おそらく改善される可能性があります。現在、最初のグループはそうでない任意の文字であり、最初のグループ[の前に何もない場合[、最初のグループには空の文字列が含まれます。

于 2012-08-22T13:06:23.380 に答える