2016-02-24 14 views
5

Tôi muốn khớp một chuỗi có số bằng hoặc cao hơn số trong nhóm chụp.Có thể sử dụng tham chiếu ngược trong một phạm vi số không?

Ví dụ:

  • 1x1 = trận đấu
  • 1x2 = trận đấu
  • 2x1 = không phù hợp

Trong tâm trí của tôi regex sẽ giống như (\d)x[\1-9] này nhưng điều này không công việc. Có thể đạt được điều này bằng cách sử dụng regex?

+3

Hương vị regex là gì? –

+0

Tôi đang cố gắng sử dụng nó trong google phân tích mà tôi không chắc chắn hương vị đó là gì nhưng tôi sẽ giả sử PCPRE – Frinsh

+2

Không, GA sử dụng RE2. Điều đó có nghĩa là không thể làm điều đó với một regex thuần túy. –

Trả lời

2

Như bạn đã phát hiện ra, bạn không thể suy một giá trị trong vòng một regex vì:

Bởi vì các lớp nhân vật được xác định khi regex được biên soạn ... Các chỉ lớp nhân vật kiểu nút regex là "hard- danh sách ký tự được mã hóa "được tạo khi regex được biên dịch (không phải sau khi nó chạy một phần và tìm ra $ 1 có thể sẽ là gì).

[Source]

Kể từ khi các lớp nhân vật không cho phép backreferences, một dấu chéo ngược theo sau là một số được thêm thắt trong một lớp nhân vật:

Một dấu chéo ngược sau đó là hai hoặc ba chữ số bát phân là được coi là một số bát phân.

[Source]

Điều này rõ ràng không phải là những gì bạn dự định bởi [\1-9]. Nhưng vì không có cách nào để biên dịch một lớp nhân vật cho đến khi tất cả các nhân vật được biết, chúng ta sẽ phải tìm một cách khác.

Nếu chúng ta đang tìm cách làm điều này hoàn toàn trong một regex, chúng ta không thể liệt kê tất cả các kết hợp có thể, bởi vì chúng ta phải kiểm tra tất cả các ảnh chụp để tìm ra cái nào khớp. For example:

"1x2" =~ m/(?:(0)x(\d)|(1)x([1-9])|(2)x([2-9])|(3)x([3-9])|(4)x([4-9])|(5)x([5-9])|(6)x([6-9])|(7)x([7-9])|(8)x([89])|(9)x(9))/ 

sẽ chứa "1" trong $3 và "2" trong $4, nhưng bạn sẽ phải tìm kiếm chụp 1-20 để tìm nếu bất cứ điều gì đã xuất hiện mỗi lần.


Cách duy nhất xung quanh làm bài xử lý kết quả regex là sử dụng một regex có điều kiện: (?(A)X) đâu A là một điều kiện và X là hành động kết quả.

Sadly conditionals are not supported by RE2, nhưng chúng tôi sẽ tiếp tục chỉ để chứng minh điều đó có thể được thực hiện.

Những gì bạn muốn sử dụng cho X(*F) (hoặc (?!) trong Ruby 2+) để buộc thất bại: http://www.rexegg.com/regex-tricks.html#fail

Những gì bạn muốn sử dụng cho A?{$1 > $2}, nhưng only Perl will allow you to use code directly in a regex.Perl sẽ cho phép bạn sử dụng:

m/(\d)x(\d)(?(?{$1 > $2})(?!))/ 

[Live Example]

Vì vậy, câu trả lời cho câu hỏi của bạn là: "Không, bạn không thể làm điều này với RE2 mà Google Analytics sử dụng, nhưng bạn có thể làm điều này với một regex Perl. "

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