c#
  • regex
  • 2011-12-08 27 views 8 likes 
    8

    Tôi đang cố gắng viết biểu thức chính quy để ghi lại URL để trỏ đến máy chủ proxy.

    bodystring = Regex.Replace(bodystring, "(src='/+)", "$1" + proxyStr); 
    

    Ý tưởng của biểu thức này là khá đơn giản, về cơ bản tìm trường hợp của "src = '/" hoặc "src =' //" và chèn một url PROXY tại điểm đó. Điều này làm việc nói chung nhưng đôi khi tôi đã tìm thấy các trường hợp mà một chữ "$ 1" sẽ kết thúc trong chuỗi kết quả.

    Điều này không có ý nghĩa với tôi bởi vì nếu không có sự trùng khớp thì tại sao nó lại thay thế được gì?

    Thật không may, tôi không thể đưa ra một ví dụ đơn giản về điều này chỉ xảy ra với các chuỗi rất lớn, nhưng tôi muốn biết khái niệm những gì có thể làm cho điều này xảy ra.

    Là một sang một bên, tôi đã cố gắng viết lại biểu thức này sử dụng một lookbehind tích cực như sau:

    bodystring = Regex.Replace(bodystring, "(?<=src='/+)", proxyStr); 
    

    Nhưng điều này kết thúc với proxyStr hai lần trong đầu ra nếu chuỗi đầu vào có chứa "src = '//". Điều này cũng không có ý nghĩa với tôi bởi vì tôi nghĩ rằng "src =" sẽ phải có mặt trong đầu vào hai lần để có được proxyStr kết thúc hai lần trong đầu ra.

    +0

    Bạn có thể cung cấp ví dụ về giá trị 'proxyStr' không? – dasblinkenlight

    +0

    Cảm ơn bạn đã phản hồi. Bạn có thể làm rõ? Tôi không chắc làm thế nào tôi có thể sử dụng một "\ 1" để giải quyết vấn đề này. Ở trên tôi có nghĩa là "$ 1" đôi khi sẽ kết thúc trong chuỗi kết quả của tôi, như trong "... new Image(). $ 1myproxy/proxy? Url = .....". – Locksleyu

    +0

    proxyStr = "10.15.15.15:8008/proxy?url=http://"; Tuy nhiên tôi đã thấy vấn đề thứ hai (nhiều trường hợp của proxyStr trong kết quả) xảy ra nhất quán ngay cả với proxyStr = "PROXY". – Locksleyu

    Trả lời

    13

    Khi proxyStr = "10.15.15.15:8008/proxy?url=http://", chuỗi thay thế trở thành "$110.15.15.15:8008/proxy?url=http://". Nó chứa một tham chiếu đến nhóm số 110, mà chắc chắn không tồn tại.

    Bạn cần đảm bảo rằng chuỗi proxy của bạn không bắt đầu bằng chữ số. Trong trường hợp của bạn, bạn có thể làm điều đó bằng cách không nắm bắt được dấu gạch chéo cuối cùng, và thay đổi chuỗi thay thế để "$1/"+proxyStr, như thế này:

    bodystring = Regex.Replace(bodystring, "(src='/*)/", "$1/" + proxyStr); 
    

    Edit:

    Rawling pointed out rằng địa chỉ thư viện regexp NET của vấn đề này: bạn có thể kèm theo 1 trong dấu ngoặc nhọn để tránh răng cưa sai sự thật, như thế này:

    bodystring = Regex.Replace(bodystring, "(src='/+)", "${1}" + proxyStr); 
    
    +1

    Thay vì được táo bạo và ăn cắp với một giải pháp thích hợp - vì bạn đã xác định được vấn đề đầu tiên ... hãy xem câu trả lời này: http://stackoverflow.com/questions/3466892/regex-replacement-capture-followed-by-digit Về cơ bản sử dụng "$ {1}" thay vì "$ 1" – Rawling

    +1

    @Rawling Cảm ơn bạn đã chỉ ra điều này! Tôi nghi ngờ phải có một cách hợp pháp để làm điều đó, và thậm chí đã cố gắng '($ 1)', nhưng tôi không tìm thấy câu trả lời '$ {1}'. Cảm ơn!!! – dasblinkenlight

    +1

    Hãy chắc chắn chấp nhận câu trả lời !! – Dracorat

    0

    trong phiên bản thứ hai, tôi đoán proxyStr xuất hiện hai lần vì bạn đang chèn nó một lần nữa. Hãy thử

    string s2 = Regex.Replace(s, "((?<=src='/+))", proxyStr); 
    
    +0

    Cảm ơn ý tưởng. Tôi đã thử điều này và nó không giúp được gì. Tôi nghĩ rằng có một số ý tưởng tại sao nó được thay thế hai lần, nhưng điều kỳ lạ là tôi nghĩ + là một nhà điều hành 'tham lam', vì vậy nếu có hai dấu gạch chéo về phía trước, nó sẽ không khớp với một. – Locksleyu

    1

    Những việc bạn đang làm không thể thực hiện được. .NET gặp rắc rối khi biến nội suy như thế này. Vấn đề của bạn là chuỗi proxy của bạn bắt đầu bằng một số: proxyStr = "10.15.15.15:8008/proxy?url=http://"

    Khi bạn kết hợp điều này với $1, điều regex của nó phải tìm kiếm ngược lại $110 không tồn tại.

    See what I mean here.

    Bạn có thể khắc phục điều này bằng cách kết hợp một cái gì đó khác, hoặc bằng cách kết hợp và xây dựng các chuỗi thay thế bằng tay vv Sử dụng những gì phù hợp với bạn nhất.

    1

    Dựa trên dasblinkenlights câu trả lời (đã +1) giải pháp là thế này:

    bodystring = Regex.Replace(bodystring, "(src='/+)", "${1}" + proxyStr); 
    

    Điều này đảm bảo rằng nhóm 1 được sử dụng và không phải là một số nhóm mới được xây dựng.

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