2

Lua スクリプトで次の文字列を取得しました。

one;two;;three;four;;five;;six;seven;

最初の文字がセミコロンになることはありません。中間の区切り文字は 1 つまたは 2 つのセミコロンにすることができ、最後の文字は 1 つのセミコロンにすることも、しないこともできます。

Lua パターンの使用 (およびstring.gsub()): 真ん中の 2 つのセミコロンを一致させて 1 つのセミコロンに置き換え、最後のオプションのセミコロンを削除するにはどうすればよいですか?

出力は次のようになります。

one;two;three;four;five;six;seven

これは単一のパターンを使用して可能ですか?

4

5 に答える 5

3

1 つのパターンを使用して複数;を単一に置き換え;、別のパターンを使用して最後のものを削除すると、次の;ようになります。

local str = "one;two;;three;four;;five;;six;seven;"
local result = str:gsub(';+', ';'):gsub(';*$', '')

1 つのパターンを使用する 1 つの可能な方法は、次のようになります。

local result = (str .. ";;;"):gsub(";+", function(s) 
                                             if s == ";" or s == ";;" then 
                                                 return ";" 
                                             else 
                                                 return "" 
                                             end 
                                         end)

私がやろうとしている;のは、文字列の最後に 3 を追加することです。そのため、1 つまたは 2 つ;を 1 に置き換える必要があります;。さらに;(3 つまたは 4 つの可能性があり、最後にある必要があります) は空の文字列に置き換えられます。

より明確であるため、2つのパターンを使用したソリューションをお勧めします。

于 2013-11-08T05:25:15.357 に答える
0

(注:私はあなたの説明に正確に従っているので、これらは1つまたは2つに一致しますが、2つ以下であり、最後の0または1つに一致しますが、1つ以下です)

-- Method one uses two patterns but it's simpler and my preferred one
s = 'one;two;;three;four;;five;;six;seven;'
s = s:gsub(';;',';'):gsub(';?$','')
print(s)

-- Method two uses one pattern (if you really MUST use only one pattern)
s = 'one;two;;three;four;;five;;six;seven;'
s = (s..';'):gsub(';;',';')
s = s:sub(1,#s-1)
print(s)
于 2015-03-31T20:29:13.703 に答える