Regex Lần xuất hiện cuối cùng?


122

Tôi đang cố gắng bắt phần cuối cùng sau dấu gạch chéo ngược cuối cùng,
tôi cần \Web_ERP_Assistant(với \)

Ý tưởng của tôi là:

C:\Projects\Ensure_Solution\Assistance\App_WebReferences\Web_ERP_WebService\Web_ERP_Assistant


\\.+?(?!\\)      //  I know there is something with negative look -ahead `(?!\\)`

Nhưng tôi không thể tìm thấy nó.

[Regexer Demo]


2
Tôi đánh giá cao rằng câu hỏi của bạn liên quan đến regexes, nhưng bạn có chắc đây là công cụ tốt nhất để sử dụng ở đây không? Hầu hết các thư viện tiêu chuẩn sẽ có một phương thức lấy tên đường dẫn cuối cùng trong một thư mục nhất định. Điều này cũng tính đến dấu phân tách thư mục trên một hệ điều hành nhất định.
Steve Rukuts

@Raskolnikov Tôi cần cái đó trong regex. Tôi biết Pth.getFileNameWithoutExtension. Câu hỏi được gắn thẻ là regex
Royi Namir

2
OK, đủ công bằng, chỉ cần đảm bảo. Sau đó, tôi sẽ giao nó cho những người giỏi về regexes hơn.
Steve Rukuts

Câu trả lời:


95

Ví dụ, giải pháp nhìn trước tiêu cực của bạn sẽ là:

\\(?:.(?!\\))+$

Xem nó ở đây trên Regexr


2
Đây (?:là sự khởi đầu của một nhóm không bắt. Là .bất kỳ ký tự nào, điều này sẽ kiểm tra bất kỳ ký tự nào nếu nó không được theo sau bởi dấu ``.
stema

Dòng Multi chỉ dành cho kiểm tra Regexr cần thiết. Nó thay đổi ý nghĩa của $. Tiêu chuẩn là cuối chuỗi, với Đa dòng là cuối hàng. Vì văn bản thử nghiệm trong Regexr có nhiều hàng nên tôi cần tùy chọn này ở đó.
stema

điều gì sẽ xảy ra nếu tôi muốn yêu cầu tương tự như câu hỏi ban đầu của tôi, nhưng không có \ ở đầu?
Royi Namir

2
(?:[^\\/](?!(\\|/)))+$loại bỏ dấu gạch chéo ở đầu và đối phó với cả dấu gạch chéo về phía trước và phía sau. Nó cũng phù hợp với toàn bộ chuỗi cho pathes mà không cần bất kỳ dấu gạch chéo trong chúng, thí dụ manual.doc
mrswadge

5
Trong một tham lam Mã luyện, dấu chấm nên luôn luôn đến sau khi lookahead: (?:(?!\\).)+. ( ref ) Ngoài ra, ví dụ của bạn trên RegExr sử dụng hai dấu gạch chéo ngược để tách các thành phần đường dẫn; chỉ nên có một và regex chỉ nên khớp với một. ( Bản demo )
Alan Moore

62

Một trong những hiệu quả cho tôi là:

.+(\\.+)$

Hãy thử nó trực tuyến!

Giải trình:

.+     - any character except newline
(      - create a group
 \\.+   - match a backslash, and any characters after it
)      - end group
$      - this all has to happen at the end of the string

15
Cảm ơn đã xuống nghỉ ngơi trong những phần :)
Jason Bruce

1
Tôi đang đặc biệt tìm kiếm một regex phù hợp với dấu gạch chéo cuối cùng (/). Hóa ra câu trả lời được chấp nhận ở trên của @stema thực hiện công việc khi dấu gạch chéo ngược được thay thế bằng dấu gạch chéo về phía trước. Của bạn phù hợp với mọi thứ sau MỌI dấu gạch chéo, đó thực sự không phải là giải pháp được tìm kiếm. Tôi upvoted câu trả lời của bạn vì lời giải thích của bạn, là succint, mặc dù giải pháp của bạn không thực sự thực hiện công việc
Chidozie Nnachor

Điều này đơn giản hơn nhiều và nhìn chung tốt hơn so với một cái nhìn tiêu cực, miễn là nó không bị gián đoạn trên một dòng, tại sao lại quá phức tạp?
Scott Anderson

42

Một cái nhìn tiêu cực về phía trước là một câu trả lời đúng, nhưng nó có thể được viết rõ ràng hơn như:

(\\)(?!.*\\)

Điều này tìm kiếm sự xuất hiện của \ và sau đó trong một séc không khớp, nó sẽ tìm kiếm bất kỳ số ký tự nào theo sau là ký tự mà bạn không muốn nhìn thấy sau nó. Bởi vì nó tiêu cực, nó chỉ khớp nếu nó không tìm thấy một điểm trùng khớp.


4
Này phù hợp với dấu chéo ngược cuối cùng chỉ . OP cũng muốn khớp mọi thứ sau đó.
Alan Moore

Rất hữu ích, phiên bản sạch hơn này, mặc dù chỉ ghi lại dấu gạch chéo ngược, nhưng đã làm cho mọi thứ trở nên nhấp nháy. Cảm ơn bạn.
Matt Binford

28

Bạn có thể thử neo nó vào cuối chuỗi, giống như \\[^\\]*$. Mặc dù tôi không chắc liệu người ta có nhất thiết phải sử dụng regexp cho tác vụ hay không.


2
Nó hiệu quả tuyệt vời đối với tôi. ([^\/]*)$khớp với tên tệp trong đường dẫn cho hộp Linux. Bạn có thể giải thích cách ^hoạt động của dấu mũ trong ngữ cảnh này không? Tôi đã từng chỉ sử dụng nó để biểu thị sự bắt đầu của chuỗi.
Brad

@Brad, đó là sự phủ định. Có nghĩa là [^\/]khớp với bất kỳ ký tự nào ngoại trừ /.
Michael Krelin - hacker

9

Điều gì về regex này: \\[^\\]+$


Tôi không nghĩ rằng điều đó cần phải có trong regex. Nhưng tôi sẽ chỉnh sửa câu trả lời của mình
SERPRO

err ... Tôi không nghĩ nó phải là regex chút nào, nhưng chắc chắn để kết hợp nó, nó nên ở trong. Không phải vấn đề, tôi chỉ nghĩ về câu trả lời của bạn có thể sai sau khi xem nó đã bị phản đối và đây là những gì tôi nghĩ ra, vì vậy tôi đã nhận xét.
Michael Krelin - hacker

@michael, đừng hiểu sai ý tôi, tôi đánh giá cao nhận xét của bạn, tôi chỉ nghĩ rằng không cần thiết phải thêm nó vào regex the \;)
SERPRO

5

Nếu bạn không muốn bao gồm dấu gạch chéo ngược mà chỉ bao gồm văn bản sau nó, hãy thử cách này: ([^\\]+)$hoặc đối với unix:([^\/]+)$


2

Tôi đã sử dụng regex dưới đây để nhận được kết quả đó khi nó kết thúc bởi một \

(\\[^\\]+)\\?$

[Regex Demo]

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.