2012-01-26 23 views
9

Tôi đang cố gắng để có được một lookahead tùy chọn nhưng đang gặp vấn đề mà ngay sau khi tôi làm cho nó tùy chọn (thêm một ? sau khi nó), nó không còn phù hợp ngay cả khi dữ liệu có.tùy chọn regex lookahead

Tóm tắt ngắn gọn, tôi đang cố gắng kéo các tham số chuỗi truy vấn cụ thể ra khỏi URI. Ví dụ:

/.*foo.html\??(?=.*foo=([^\&]+))(?=.*bar=([^\&]+))/ 
    .exec('foo.html?foo=true&bar=baz') 

tôi sẽ phá vỡ ra một chút:

.*foo.html\??  // filename == `foo.html` + '?' 
(?=.*foo=([^\&]+)) // find "foo=...." parameter, store the value 
(?=.*bar=([^\&]+)) // find "bar=...." parameter, store the value 

Ví dụ trên hoạt động hoàn hảo trong điều kiện rằng cả hai foobar tồn tại như tham số trong chuỗi truy vấn. Vấn đề là tôi đang cố gắng để thực hiện các tùy chọn, vì vậy tôi đã thay đổi nó để:

/.*foo.html\??(?=.*foo=([^\&]+))?(?=.*bar=([^\&]+))?/ 
           ↑     ↑ 
    Added these question marks ─┴──────────────────┘ 

và nó không còn phù hợp với bất kỳ thông số, mặc dù nó vẫn còn phù hợp với foo.html. Bất kỳ ý tưởng?

+0

Tại sao bạn sử dụng cụm từ thông dụng cho điều này? Đơn giản chỉ cần tách chuỗi và lưu trữ các cặp khóa/giá trị trong một đối tượng. – ThiefMaster

+0

@ThiefMaster - Bởi vì tôi muốn :) Và tôi muốn thậm chí nhiều hơn bây giờ nó sẽ không hoạt động. Trong thực tế, nó đơn giản chỉ vì mã ngắn hơn nhiều khi tôi chỉ cần lấy 2 thông số. –

+0

Tại sao bạn cần lookahead? Để khớp với foo.html? Bar = baz & foo = true? – Bergi

Trả lời

4

Cố gắng đặt dấu hỏi vào nhìn về phía trước:

...((?=(?:.*foo=([^\&]+))?)... 

Trông kỳ quặc, nhưng tôi nghĩ rằng một regex đẹp không phải là mục đích :-)

Ngoài ra, có bạn nghĩ về cái này?

/.*foo.html\??.*(?:foo|bar)=([^\&]+).*(?:bar|foo)=([^\&]+)/ 
+1

Cảm ơn, đầu tiên một công trình. Tôi nghĩ rằng điều này là cần thiết vì động cơ có thể tối ưu hóa '(? =)?' Hoàn toàn (tức là chỉ bỏ qua nó) vì một regex không phù hợp tùy chọn là, tốt, vô nghĩa. Tôi chỉ tình cờ sử dụng nó để bắt một thứ khác. Cái thứ hai của bạn cũng sẽ hoạt động, ngoại trừ nó sẽ cần một vài tinh chỉnh để làm cho mỗi tham số tùy chọn, và có một chút logic hơn sau khi bạn cần tìm ra tham số nào ở đâu (bạn cần loại bỏ hai tham số '? : ''s sau đó kiểm tra chống lại những người) –

+0

Dù sao, làm cho lookahead tùy chọn sẽ dẫn đến kết hợp một chuỗi rỗng. – Bergi

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