15

Luaで達成することは可能ですか?

local noSlashEnding = string.gsub("slash\\ending\\string\\", "\\|/$", "")
-- noSlashEnding should contain "slash\\ending\\string"

local noSlashEnding2 = string.gsub("slash/ending/string/", "\\|/$", "")
-- noSlashEnding2 should contain "slash/ending/string"

ここでのポイントは、Lua パターンで論理「or」ステートメントを受け入れないことです。


編集:これを行うことで可能であることに気付きました:

strng.gsub("slash\\ending\\string\\", "[\\/]$", "")

パターンの論理「または」はまだありませんが。

4

3 に答える 3

13

Lua は、パターン マッチングに標準の正規表現を使用しません。本Programming in Luaからの引用は、その理由を説明しています:

他のいくつかのスクリプト言語とは異なり、Lua はパターン マッチングに POSIX 正規表現 (regexp) を使用しません。この主な理由はサイズです。POSIX regexp の典型的な実装には、4,000 行以上のコードが必要です。これは、すべての Lua 標準ライブラリを合わせたものよりも大きくなります。それに比べて、Lua でのパターン マッチングの実装は 500 行未満です。もちろん、Lua のパターン マッチングは、完全な POSIX 実装が行うすべてのことを行うことはできません。それにもかかわらず、Lua のパターン マッチングは強力なツールであり、標準の POSIX 実装と一致させるのが難しい機能がいくつか含まれています。

ただし、既存の正規表現ライブラリーや高度なLPegライブラリーへのバインディングが多数あります。リンク付きのリストについては、http://lua-users.org/wiki/LibrariesAndBindingsの章を参照してくださいText processing

また、次の質問も参照してください: Lua パターン マッチングと正規表現

于 2010-08-13T09:57:36.637 に答える
9

Luaのパターン マッチングは正規表現とは異なり、代替の概念はありません。

たとえば、文字列の末尾から"abc"orを削除する場合 (正規表現と同様)、次のコードが適切に機能します。"efg""(abc|efg)$"

local inputstring="123efgabc"
local s,n = inputstring:gsub("abc$", "")
if n == 0 then
  s,n = inputstring:gsub("efg$", "")
end
print(s) --> 123efg
于 2010-08-11T23:07:52.490 に答える
1

Lua の正規表現は ... 異常です。ドキュメントからわかる限り、一般的な代替やグループへの繰り返し演算子の適用はサポートされていません。あなたの場合、あなたが言うように、文字クラスで必要なものを取得できます(ただし、文字クラスでコンマが何をしているのかわかりません)。

ここを参照してください: http://www.lua.org/manual/5.1/manual.html#5.4.1

(私が以前取り組んでいたプロジェクトでは、このため、PCRE への独自の Lua バインディングを作成しました。)

于 2010-08-11T22:17:55.280 に答える