2013-03-04 71 views
18

Tôi có regex này:(^?) * Có nghĩa là gì trong regex này?

^(^?)*\?(.*)$ 

Nếu tôi hiểu đúng, đây là sự phân hủy của những gì nó làm:

  • ^- bắt đầu phù hợp ngay từ đầu của chuỗi
  • (^?) * - Tôi không biết, nhưng nó lưu trữ nó trong $ 1
  • \? - phù hợp với một dấu hỏi
  • $ (. *) - phù hợp với bất cứ điều gì cho đến khi kết thúc của chuỗi

Vậy (^?) * Nghĩa là gì?

+0

Bạn có thể chỉ định công cụ regex đang được sử dụng tại đây không? – JaredPar

+0

Lua! http://www.lua.org/pil/20.1.html – doremi

+1

@doremi: Sau khi tôi đọc tài liệu, regex của Lua là một con thú của riêng nó. Ý nghĩa của regex có thể thay đổi cho dù nó được sử dụng với gmatch hoặc khớp. – nhahtdh

Trả lời

20

(^?) chỉ cần tìm ký tự chữ cái ^. Ký tự ^ trong mẫu regex chỉ có ý nghĩa đặc biệt khi được sử dụng làm ký tự đầu tiên của mẫu hoặc ký tự đầu tiên trong kết hợp nhóm []. Khi sử dụng bên ngoài những 2 vị trí các ^ được hiểu theo nghĩa đen có nghĩa là ở ngoại hình cho nhân vật ^ trong chuỗi đầu vào

Lưu ý: Có hay không ^ ngoài vị trí đầu tiên và nhóm được hiểu theo nghĩa đen là regex engine cụ thể. Tôi không quen thuộc với LUA để tuyên bố rằng nó có

+0

Hmm. Tôi vẫn không hiểu. Bạn có thể cho tôi một ví dụ về một chuỗi mà điều này sẽ phù hợp? FYI - điều này đang được sử dụng trên url có chuỗi truy vấn. – doremi

+2

không có bình luận về sự vô nghĩa của '(^?) *'? nghĩa là khớp 0 hoặc một ký tự, chỉ khớp với ký tự '^', khớp 0 với nhiều lần - giống nhau (có thể) là '(^ *)' trừ khi nhiều nhóm đang được sử dụng – AD7six

+0

Nó có thể là một regex xấu nó sẽ được cung cấp cho tôi bởi người khác. Đó là một phần lý do tại sao tôi đang cố gắng để hiểu những gì nó làm. – doremi

2

Trong trường hợp này, dấu (^?) Tham chiếu đến chuỗi trước "^" có nghĩa là ký tự chữ^như Jared đã nói. Kiểm tra regexlib để giải mã thêm.

Đối với tất cả Regex của bạn cần: http://regexlib.com/CheatSheet.aspx

1

Có vẻ với tôi như mục đích của tác giả của biểu thức là để phù hợp với bất kỳ số lượng^trước dấu chấm hỏi, nhưng chỉ muốn chụp trường hợp đầu tiên của ^. Tuy nhiên, nó có thể không phải là một biểu thức hợp lệ tùy thuộc vào động cơ, như những người khác đã nêu.

6

Lua không có ngôn ngữ regexp thông thường, nó có các mẫu Lua ở vị trí của nó. Trong khi chúng trông rất giống regexp, các mẫu Lua là một ngôn ngữ riêng biệt của riêng chúng, có một bộ quy tắc đơn giản và quan trọng nhất là thiếu các tính năng nhóm và xoay vòng.

Được hiểu là mẫu Lua, ví dụ sẽ gây ngạc nhiên cho người dùng regexp lâu năm vì rất nhiều chi tiết khác nhau.

Mẫu Lua là describedinPiL, và ở cái nhìn đầu tiên cũng tương tự như cụm từ thông thường để gây nhầm lẫn. Sự khác biệt lớn nhất có lẽ là thiếu một nhà điều hành luân phiên |, ngoặc chỉ được sử dụng để đánh dấu ảnh chụp, quantifiers (?, -, +, và *) chỉ áp dụng đối với một nhân vật hoặc nhân vật đẳng cấp, và % là các ký tự thoát không \. Một đầu mối lớn mà ví dụ này có lẽ không được viết với Lua trong tâm trí là việc thiếu ký tự Lua trích dẫn ký tự % áp dụng cho bất kỳ (hoặc lý tưởng nhất) tất cả các ký tự không phải chữ số trong chuỗi mẫu và sử dụng đáng ngờ \? có mùi như một regexp thông thường để khớp với một chữ cái đơn ?.

Câu trả lời đơn giản cho câu hỏi là: (^?)* không phải là biểu mẫu được đề xuất và sẽ khớp với ^* hoặc *, ghi lại sự hiện diện hoặc vắng mặt của dấu mũ. Nếu đó là hiệu ứng dự định, thì tôi sẽ viết nó là (%^?)%* để làm rõ hơn.

Để xem tại sao đây là trường hợp, hãy lấy mẫu được đưa ra và phân tích mẫu dưới dạng mẫu Lua. Toàn bộ mô hình là:

^(^?)*\?(.*)$ 

Handed để string.match(), nó sẽ được hiểu như sau:

^ neo trận đấu với đầu của chuỗi.

( đánh dấu sự bắt đầu của lần chụp đầu tiên.

^ không phải ở đầu mẫu hoặc lớp nhân vật, vì vậy nó khớp với ký tự ^ theo nghĩa đen. Để rõ ràng, có thể đã được viết là %^.

? khớp chính xác bằng 0 hoặc một trong các ký tự trước đó.

) đánh dấu kết thúc lần chụp đầu tiên.

* không theo thứ gì đó có thể được định lượng sao cho nó khớp với ký tự * theo nghĩa đen. Để rõ ràng, có thể đã được viết là %*.

\ trong mẫu phù hợp với chính nó, nó không phải là ký tự thoát trong ngôn ngữ mẫu. Tuy nhiên, một ký tự thoát trong một chuỗi ngắn Lua bằng chữ, làm cho ký tự sau không đặc biệt đối với trình phân tích cú pháp bằng chữ mà trong trường hợp này là tranh luận bởi vì ? sau đây không có gì đặc biệt trong mọi trường hợp. Vì vậy, nếu mẫu được đính kèm trong dấu nháy kép hoặc đơn, thì \ sẽ được hấp thụ bằng phân tích cú pháp chuỗi. Nếu viết bằng một chuỗi dài (như , dấu chéo ngược sẽ sống sót trong phân tích cú pháp chuỗi, xuất hiện trong mẫu.

? trận đấu chính xác không hoặc một trong những nhân vật trước đó.

( đánh dấu đầu chụp thứ hai .

. phù hợp với bất kỳ ký tự nào cả, có hiệu quả một từ đồng nghĩa với lớp [\000-\255] (hãy nhớ, trong Lua thoát số trong hệ thập phân không bát phân như trong C).

* mat ches zero hoặc nhiều hơn của nhân vật trước đó, tham lam.

) đánh dấu sự kết thúc của lần chụp thứ hai.

$ neo mẫu vào cuối chuỗi.

Vì vậy, nó khớp và chụp ^ tùy chọn ở đầu chuỗi, theo sau là *, sau đó là tùy chọn \ không được chụp và chụp toàn bộ phần còn lại của chuỗi. string.match sẽ trả lại hai chuỗi thành công (một hoặc cả hai chuỗi có thể bằng không), hoặc nil về lỗi.

Chỉnh sửa: Tôi đã khắc phục một số lỗi chính tả và sửa lỗi trong câu trả lời của tôi, được chú ý bởi Egor trong nhận xét. Tôi quên rằng trong các mẫu, các ký hiệu đặc biệt làm mất đi sự đặc biệt của họ khi ở một nơi mà nó không thể áp dụng được. Điều đó làm cho dấu hoa thị đầu tiên khớp với dấu hoa thị hơn là một lỗi. Dòng thác rơi qua phần lớn câu trả lời.

Lưu ý rằng nếu bạn thực sự muốn có một regexp thực sự trong Lua, có sẵn các thư viện sẽ cung cấp nó. Điều đó nói rằng, ngôn ngữ mô hình dựng sẵn khá mạnh mẽ. Nếu nó không đủ, thì bạn có thể tốt nhất là sử dụng một trình phân tích cú pháp đầy đủ và sử dụng LPeg có thể làm mọi thứ có thể và nhiều hơn nữa. Nó thậm chí đi kèm với một mô-đun cung cấp một cú pháp regexp hoàn chỉnh được dịch sang ngữ pháp LPeg để thực thi.

+0

Thực ra, '*' đầu tiên không phải là lỗi, nó chỉ là phép thuật ít hơn. Ví dụ, 'assert (string.match ("^* ","^(^?) * "))' –

+0

@EgorSkriptunoff Tôi nghĩ bạn đúng. Hiệu ứng cũng giống nhau, mẫu không khớp với những gì người dùng regex nghĩ rằng nó sẽ khớp. – RBerteig

Các vấn đề liên quan