2010-08-11 27 views
8

Có thể đạt được ở Lúa?Hợp lý 'hoặc' trong các mẫu 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" 

Điểm ở đây là không chấp nhận các câu lệnh logic hoặc '' trong các mẫu Lua.


EDIT: Chỉ cần nhận ra rằng có thể bằng cách làm này:

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

Mặc dù logic 'hoặc' cho mô hình vẫn còn thiếu.

Trả lời

6

Lua không sử dụng biểu thức thông thường tiêu chuẩn cho khớp mẫu. Trích dẫn từ sách Programming in Lua giải thích lý do:

Không giống như một số ngôn ngữ kịch bản khác, Lua không sử dụng cụm từ thông dụng POSIX (regexp) cho đối sánh mẫu. Lý do chính cho việc này là kích thước: Việc triển khai điển hình POSEX regexp mất hơn 4.000 dòng mã. Đây là lớn hơn tất cả các thư viện chuẩn Lua với nhau. Trong khi đó, việc thực hiện khớp mẫu ở Lúa có ít hơn 500 dòng. Tất nhiên, sự khớp mẫu trong Lua không thể làm tất cả những gì mà một triển khai POSIX đầy đủ thực hiện. Tuy nhiên, mô hình phù hợp trong Lua là một công cụ mạnh mẽ và bao gồm một số tính năng rất khó để phù hợp với triển khai POSIX tiêu chuẩn.

Tuy nhiên, có nhiều ràng buộc với thư viện biểu thức chính quy hiện có và thư viện nâng cao LPeg. Để biết danh sách các liên kết này, hãy xem http://lua-users.org/wiki/LibrariesAndBindings, chương Text processing.

Ngoài ra, hãy xem câu hỏi này: Lua pattern matching vs. regular expressions

0

Cụm từ thông dụng Lua là ... bất thường. Theo như tôi có thể nói từ tài liệu, không có sự hỗ trợ cho việc luân phiên chung, cũng như không áp dụng các toán tử lặp lại cho các nhóm. Trong trường hợp của bạn, như bạn nói, bạn có thể có được những gì bạn muốn với một lớp nhân vật (tôi không chắc chắn những gì dấu phẩy đang làm trong lớp nhân vật của bạn, mặc dù).

Xem ở đây: http://www.lua.org/manual/5.1/manual.html#5.4.1

(Trong một dự án tôi đã từng làm việc trên, chúng tôi đã viết Lua riêng của chúng tôi liên kết với PCRE vì điều này.)

3

Lua pattern matching là không giống như biểu thức thông thường, và không có khái niệm luân phiên.

Ví dụ, nếu bạn muốn loại bỏ "abc" hoặc "efg" từ ngày kết thúc của một chuỗi (tương tự như biểu thức chính quy) đoạn mã sau sẽ làm việc tốt:

local inputstring="123efgabc" 
local s,n = inputstring:gsub("abc$", "") 
if n == 0 then 
    s,n = inputstring:gsub("efg$", "") 
end 
print(s) --> 123efg 
Các vấn đề liên quan