4

次の形式の文字列があります。

cake!apple!

apple!

cake!juice!apple!cake!

juice!cake!

つまり、これらの文字列は 、 、 の 3 つの部分文字列で構成さ"cake!""apple!"ます"juice!"

これらの文字列を検証する必要があります。したがって、正規表現でこれを行う方法は次のとおりです。

/^(apple!|juice!|cake!)*$/

しかし、Lua のパターンには|演算子がないため、この方法では実行できないようです。

Lua で文字列を検証するにはどうすればよいですか?

(文字列の内容は気にしません。文字列が適合 (検証) するかどうかだけを気にします。)

これを行うコードを書くことは知っていますが、これを行う簡単な方法は思いつきません。私は短い解決策を探しています。私が気付いていないエレガントな解決策があるのだろうか。何か案は?

4

7 に答える 7

2

文字列に決して含まれない文字がある場合、たとえば、文字"\1"(ASCII 1) が通常の文字列に含まれる可能性は低い場合、これを使用できます。

local str = "cake!juice!apple!cake!"
if str:gsub("apple!","\1"):gsub("juice!","\1"):gsub("cake!","\1"):gsub("\1","") == "" then
    --do something
end

パターンのすべての一致を に"\1"置き換え、最後に"\1"空の文字列に置き換えると、正しい一致は最終的に空の文字列になります。

欠点があります (文字列に含まれていない文字を見つけることができない場合もあります) が、多くの状況で機能すると思います。

于 2013-11-13T14:11:18.520 に答える
0

何かのようなもの:

local words = {cake=1,apple=2,juice=3}
local totals = {}
local matches = 0
local invalid = 0
string.gsub("cake!","(%a+)!",
   function(word)
      local index = words[word]
      if index then
         matches = matches + 1
         totals[index] = totals[index] + 1
      else
         invalid = invalid + 1
      end
   end
)

if matches > 0 and invalid == 0 then
   -- Do stuff
end

これにより、各単語が提供された関数に渡され、そこで各単語を検証できます。

于 2013-11-13T14:24:36.640 に答える
0

Lua パターンは正規表現に代わるものではなく、この種のパターンを表すことはできません。この場合、文字列の先頭が単語の 1 つと一致することを繰り返し確認してから、それを削除する必要がありますが、おそらくすでにそれを知っているでしょう.

于 2013-11-13T14:03:55.650 に答える
-3

問題を解決するのに役立つかどうかはわかりません。しかし、string.find() を使用すると、「または」を使用できます。見る:

str="juice!"

print(string.find(str, "cake!" or "teste"))

よろしくお願いします

于 2013-11-13T14:01:26.903 に答える