Lua で Mushclient プラグインを作成しています。Mushclient には、rex.new 関数を使用して正規表現をコンパイルできる PCRE mod が含まれています。私がやろうとしていることを達成するためにこれを使用する必要があるかどうかはわかりませんが、私はむしろしたくありませんが、そうするかもしれないと思います.
基本的に、区切り文字「、」または「および」を使用して文字列をテーブルに分割できるようにしたいと考えています。ただし、これらの「セパレーター」が、分割しないままにしたい項目 (つまり、猫のフェリックス) 内に表示される場合があります。これまでに行ったことは次のとおりです。
false_separators = {"Felix, the Cat", "orange and tan cat", "black and white cat"}
separators = rex.new(" ?(.+?)(?:,| and )")
local sample_text = "a black and white cat, a tabby cat, a giant cat, Felix, the Cat and an orange and tan cat."
index = 1
matches = {}
separators:gmatch(sample_text, function (m, t)
for k, v in pairs(t) do
print(v)
table.insert(matches, v)
end
end)
これは出力されます:
a black
white cat
a tabby cat
a giant cat
Felix
the Cat
an orange
これには 2 つの問題があります。まず、最後の項目が含まれていません。第二に、false_separators テーブルを実装する方法がわかりません。私の望ましい出力は次のとおりです。
a black and white cat
a tabby cat
a giant cat
Felix, the Cat
an orange and tan cat
私は多くのgsubingでそれを行うことができましたが、それは洗練されておらず、おそらく悪用可能または遅いようです:
false_separators = {"Felix, the Cat", "orange and tan cat", "black and white cat"}
local sample_text = "a black and white cat, a tabby cat, a giant cat, Felix, the Cat and an orange and tan cat."
function split_cats(text, false_sep)
for k, v in ipairs(false_sep) do
text = text:gsub(v, v:gsub(" ", "_")) -- replace spaces in false separator matches with underscores
end
text = text:gsub(" and ", ", "):gsub(", ", ";") -- replace ' and ' (that isn't surrounded by underscores) with a comma, then replace all commas that aren't followed by underscores with a semi-colon. Semi-colon is now the true delimiter
m = utils.split (text, ";") or {} -- split at semi-colon
for i, v in ipairs(m) do
m[i] = v:gsub("_", " ") -- remove underscores
end
return m
end
table.foreach(split_cats(sample_text, false_separators), print)
出力:
1 a black and white cat
2 a tabby cat
3 a giant cat
4 Felix, the Cat
5 an orange and tan cat.