質問
ルアで達成することは可能ですか?
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パターンの論理的または「ステートメント」または「ステートメントの受け入れなし」です。
編集:これを行うことでそれが可能であることに気付いただけです:
strng.gsub("slash\\ending\\string\\", "[\\,/]$", "")
論理的な 'または' forパターンはまだ欠落していますが。
解決
LUAは、パターンマッチングに標準的な正規表現を使用しません。本からの引用 ルアでのプログラミング 理由を説明します:
他のいくつかのスクリプト言語とは異なり、LUAはパターンマッチングにPOSIX正規表現(Regexp)を使用していません。これの主な理由はサイズです。POSIXRegexpの典型的な実装は、4,000行以上のコードを使用します。これは、すべてのLUA標準ライブラリよりも大きいです。それに比べて、LUAでのパターンマッチングの実装には500回未満のラインがあります。もちろん、LUAで一致するパターンは、完全なPOSIX実装が行うことをすべて実行することはできません。それにもかかわらず、LUAでのパターンマッチングは強力なツールであり、標準のPOSIX実装と一致するのが難しいいくつかの機能が含まれています。
ただし、既存の正規表現ライブラリには多くのバインディングがあり、高度なバインディングもあります lpeg 図書館。リンクがあるそれらのリストについては、参照してください http://lua-users.org/wiki/librariesandbindings, 、章 Text processing
.
また、この質問を参照してください。 LUAパターンマッチングと正規表現
他のヒント
ルア パターンマッチング 正規表現と同じではなく、代替概念がありません。
たとえば、削除したい場合 "abc"
また "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
LUAの正規表現は...異常です。ドキュメントから知る限り、一般的な交互の代替や繰り返しオペレーターをグループに適用することはサポートされていません。あなたの場合、あなたが言うように、あなたはキャラクタークラスであなたが望むものを得ることができます(ただし、あなたのキャラクタークラスでコンマが何をしているのかわかりません)。
ここを参照してください: http://www.lua.org/manual/5.1/manual.html#5.4.1
(私が以前取り組んでいたプロジェクトで、私たちはこのためにPCREに独自のLUAバインディングを書きました。)