2016-09-28 7 views
1

以下のコードを見てください。括弧内の項目が1つの場合の文字列の分割

str = "1791 (AR6K Async) S 2 0 0 0 -1 2129984 0 0 0 0 0 113 0 0 20 0 1 0 2370 0 0 4294967295 0 0 0 0 0 0 0 2147483647 0 3221520956 0 0 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0" 

for val in str:gmatch("%S+") do 
    print(val) 
end 

出力:

1791                   
(AR6K         
Async)     
S   
2    
0     
0   
0    
-1 
.... 

しかし、私は、出力などを期待しています、

1791 
(AR6K Async) 
S 
2 
0 
0 
0 
-1 
... 

誰がどのように単一の値ではなく、個別の取得とブラケットの値を得るために私を助けてください値。

+2

あなたの 'str:gmatch'呼び出しは、空白(空白)で分割されます。それに関する限り、 '('と ')'文字について特別なものはありません。それらは '1'や' A'のように空白ではない文字です。だからあなたのコードがあなたが見ていることをしているのです。私はあなたがしたいことをする*シンプルな方法があるかどうか分からないので、私は答えを投稿していません。考えることの1つ:ネストされたカッコまたは不一致のかっこをどうやって処理したいですか?例: ''((foo))(bar) ''または '' foo) ''? (その可能性を無視したいのであれば大丈夫かもしれませんが、仮定は明白でなければなりません)。 –

答えて

0

これを実行するために単一のルアパターンを単独で使用することはできません。文字列の独自の解析/分割をロールまたは単に(で終わる部分に)

始まる部分から部品を連結するためにコードビットを拡張することが容易であることができるしかし

こちら小さな例

str = "1791 (AR6K Async) S 2 0 0 0 -1 2129984 0 0 0 0 0 113 0 0 20 0 1 0 2370 0 0 4294967295 0 0 0 0 0 0 0 2147483647 0 3221520956 0 0 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0" 

local temp 
for val in str:gmatch("%S+") do 
    if temp then 
    if val:sub(#val, #val) == ")" then 
     print(temp.." "..val) 
     temp = nil 
    else 
     temp = temp.." "..val 
    end 
    elseif val:sub(1,1) == "(" then 
    temp = val 
    else 
    print(val) 
    end 
end 

このコードは、それが開口部ブラケットで始まる部分文字列に遭遇したとき、それはtemp変数に保存することを除いて、まさに自分自身のように振る舞います。次に、新しい値をtempに連結し、最後に閉じ括弧を含む部分文字列が出現するまで続けます。その時点でtempに保存された文字列全体が出力され、tempはnilに設定され、ループは正常に継続されます。

したがって、大括弧で囲まれた文字列が来る場合にのみコーディングされる特殊なケースがあります。

これは最も効率的な実装ではありませんが、機能します。また、これは、区切り文字がスペースであることを前提としています。なぜなら、文字列が変数tempに連結されると、それらは通常のスペースと連結されるからです。これはネストされた括弧を扱いません。 これはアイデアの簡単なデモンストレーションでしたが、私はあなたがそれを使用する場合に必要とするように、あなた自身でこれらの欠点を修正できると信じています。

1
str = "1791 (AR6K Async) S 2 0 0 0 -1 2129984 0 0 0 0 0 113 0 0 20 0 1 0 2370 0 0 4294967295 0 0 0 0 0 0 0 2147483647 0 3221520956 0 0 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0" 

for val in str:gsub("%S+","\0%0\0") 
       :gsub("%b()", function(s) return s:gsub("%z","") end) 
       :gmatch("%z(.-)%z") do 
    print(val) 
end 

説明:
1.サラウンド「ゼロマーク」
を持つすべてのspacelessストリング(最初と最後に1つに一つのバイナリゼロ文字を追加)
2. [削除「ゼロマーク」中括弧内から
3.囲まれた部分をすべて表示する

関連する問題