純 Lua 中的全功能正則表達式庫 (Fully-featured regex library in pure Lua)


問題描述

純 Lua 中的全功能正則表達式庫 (Fully‑featured regex library in pure Lua)

我正在編寫一個Elder Scrolls Online 插件,它由名為Havok Script<的經過輕微修改的Lua 5.1 引擎提供支持。 /a>。此 Lua 環境不允許訪問 osiopackagedebug 模塊或任何本機平台綁定,並且沒有辦法繞過這個限制,因為 ESO 是專有軟件。

在這個受限的環境中,我需要一個功能完整的正則表達式引擎,它具有環視功能(負向和正向的前瞻和後視)。性能幾乎無關緊要,但方便是最重要的問題(我沒有時間或能力編寫自己的正則表達式引擎)。

正則表達式引擎的實際語法不如特徵集重要。所以 PCRE、JS 正則表達式、Java 正則表達式或 .NET 正則表達式引擎,以上任何一種,甚至有點不同的東西,都可能沒問題。POSIX 太簡單了,因為它不支持任何環視行為。

正則表達式將是未經驗證的用戶輸入,但環境實際上是一個沙箱,因此用戶無法對其進行任何惡意操作。由於輸入是用戶輸入,我不能“只”使用 LPEG 之類的東西;用戶群絕對反對必須學習一個全新的概念,例如 LPEG,而不是相對熟悉的正則表達式語法。

在尋找 Lua 正則表達式引擎時,我已經用盡了許多選擇:

  • 綁定到原生平台,像 lregexp 和其他 libpcre Lua 綁定。這些絕對不會也永遠不會適用於我的用例,因為環境無法訪問本機平台,所以它們已經出局了。
  • reLua,它支持基本的“常規”模式,如交替和貪婪閉包,但絕對沒有環顧行為。我沒有能力為這個項目添加環視,所以除非存在一個添加的分支,否則我不能使用它。
  • 轉譯一個用純 JavaScript 實現的完整正則表達式引擎(不使用JS 的內置正則表達式函數)使用 castl 導入 Lua。這有點有希望,但我遇到了 致命缺陷,顯然還有 tessel ,因為 Lua 的每個範圍的變量限制為 200,而這些轉譯器沒有任何解決方法(他們要做的是將一個局部變量聲明為表並填充所有將數據放入該表中,然後將原始 JS 中的所有引用從局部變量訪問更改為 Lua 中的表訪問)。因為這是一個如此基本的問題,我不確定這是否可行,但也許最接近解決方案的方法是嘗試通過以某種方式解決這個問題來解決這個問題?
  • 我一直在尋找來自 JS 以外的其他語言的編譯器,但我沒有找到。基本上,我能找到的唯一“將 X 語言轉換為純 Lua”編譯器是 castl 和 tessel。
  • 我也(絕望地)嘗試編譯一個最新版本,emscriptened libpcre(對於初學者:編譯成 JS 的 C 代碼)然後轉譯那個使用 castl 進入 Lua。這會導致在運行代碼時出現更奇怪的 Lua 錯誤,即 Lua 解釋器找不到要求 goto 的標籤,儘管該標籤明顯存在於代碼中。我只能認為這是因為生成的代碼太大以至於 Lua 放棄了尋找它。

此刻我陷入了僵局;我不知道如何繼續獲得我想要的功能。是否有一個庫可以為 Lua 提供一個純 Lua、功能齊全的正則表達式引擎,但我還沒有找到?我放棄了谷歌的第七或第八頁。


參考解法

方法 1:

Depending on what your exact requirements are, you could try out the re module of LPEG. The clear advantage is that this is available basically everywhere where Lua is available. On the other hand you have to keep in mind that this is an independent implementation of regex and is therefore not compatible with, e.g. POSIX. However, as long as the expression are simple enough you should not notice.

方法 2:

Answering my own question, the best solution seems to be HRE for Haxe. The reasons why I chose this include:

  • Haxe generates excellent Lua code.
  • Compiling (or transpiling?) Haxe to Lua is easy and reliable, since Haxe is designed to support this use case.
  • The regex library (HRE) is extremely high quality, and supports positive and negative lookaheads and lookbehinds.
  • Familiar syntax.

(by allquixoticHenri Menkeallquixotic)

參考文件

  1. Fully‑featured regex library in pure Lua (CC BY‑SA 2.5/3.0/4.0)

#lua #RegEx






相關問題

使用 MSXML2.ServerXMLHTTP 從網頁訪問數據會在 Lua 中返回截斷的數據 (Using MSXML2.ServerXMLHTTP to access data from a web page returns truncated data in Lua)

如何在 VS 2008 中包含 Lua 庫 (How can I include Lua library in VS 2008)

Corona 中的 iPad 式慣性滾動 (iPad-style inertial scrolling in Corona)

Lua cư xử kỳ lạ trên nền tảng PowerPC / LynxOS, tại sao? (Lua behaves weird on PowerPC/LynxOS platform, why?)

我們如何在函數輸入參數中輸入類型值作為對象? (How do we input type value as object in function input parameter?)

反編譯 Lua 字節碼的最佳工具? (Best tool(s) for decompiling Lua bytecode?)

本機 Lua 中的高效可變字節數組 (Efficient mutable byte array in native Lua)

在 Lua 中字符串化對象名稱 (Stringify object name in Lua)

純 Lua 中的全功能正則表達式庫 (Fully-featured regex library in pure Lua)

自我作為參數,並設置範圍? (self as param, and setting scope?)

已經放 } 但錯誤仍然說 } 是預期的? (Already put } but the error still says that } is expected?)

我想使用 HPC 的 gpu 並嘗試 module add CUDA ...但出現錯誤。錯誤是“Lmod 檢測到以下錯誤: (I want to use the gpu of the HPC and try module add CUDA... But errors occurs. The error is "Lmod has detected the following error:)







留言討論