2009-05-06 26 views
60

Tôi có tệp văn bản biểu thị nhận xét với một đơn '.Regex sẽ nắm bắt mọi thứ từ 'đánh dấu đến cuối dòng?

Một số dòng có hai dấu ngoặc kép nhưng tôi cần lấy mọi thứ từ phiên bản đầu tiên của ' và nguồn cấp dữ liệu dòng.

I AL01     ' A-LINE       '091398 GDK 33394178  
     402922 0831850 '         '091398 GDK 33394179  
I AL02     ' A-LINE       '091398 GDK 33394180  
     400722 0833118 '         '091398 GDK 33394181  
I A10A     ' A-LINE 102      ' 53198 DJ 33394182  
     395335 0832203 '         ' 53198 DJ 33394183  
I A10B     ' A-LINE 102      ' 53198 DJ 3339418 

Trả lời

68
'.* 

Tôi tin rằng bạn cần tùy chọn, Nhiều người.

61

Các regex thích hợp sẽ là 'char tiếp theo bất kỳ số lượng bất kỳ ký tự [bao gồm zero chars] kết thúc với một kết thúc của chuỗi/dòng mã thông báo:

'.*$ 

Và nếu bạn muốn chụp tất cả mọi thứ sau của char nhưng không bao gồm nó trong đầu ra, bạn sẽ sử dụng:

(?<=').*$ 

này về cơ bản nói cho tôi tất cả các nhân vật mà fo llow 'char cho đến cuối dòng.

Sửa:. Nó đã được lưu ý rằng $ là tiềm ẩn khi sử dụng * và do đó không yêu cầu nghiêm ngặt, do đó các mô hình:

'.* 

là đúng về mặt kỹ thuật, tuy nhiên nó là rõ ràng hơn để được cụ thể và tránh sự nhầm lẫn để bảo trì mã sau này, do đó tôi sử dụng $. Đó là niềm tin của tôi rằng nó luôn luôn là tốt hơn để tuyên bố hành vi rõ ràng hơn dựa vào hành vi tiềm ẩn trong các tình huống mà sự rõ ràng có thể được đặt câu hỏi.

+1

Các $ là không cần thiết. Dấu chấm sẽ dừng ở cuối dòng trong các trường hợp bình thường. – Tomalak

+7

không cần thiết - nhưng thích hợp cho những gì anh ta muốn làm. Nó phục vụ như một lời nhắc nhở sau đó rằng nó đang mong đợi tất cả mọi thứ từ 'đến cuối dòng – gnarf

+0

@balabaster: Tôi không nói rằng nó đã sai. ;-) Nó chỉ là một chú thích. – Tomalak

15
'.*$ 

Bắt đầu với một dấu nháy đơn ('), phù hợp với bất kỳ ký tự (.) không hoặc nhiều lần (*) cho đến cuối dòng ($).

+0

Tôi thích lời giải thích ngắn gọn của bạn. Cảm ơn! – EdwardM

2

này sẽ nắm bắt được tất cả mọi thứ lên đến 'trong backreference 1 - và tất cả mọi thứ sau khi' ở backreference 2. Bạn có thể cần phải thoát khỏi dấu nháy mặc dù tùy thuộc vào ngôn ngữ (\ ')

/^([^']*)'?(.*)$/ 

sửa đổi nhanh: nếu dòng không có một '- backreference 1 vẫn nên nắm bắt toàn bộ dòng.

^ - start of string 
([^']*) - capture any number of not ' characters 
'? - match the ' 0 or 1 time 
(.*) - capture any number of characters 
$ - end of string 
4

Khi tôi thử '. * Trong cửa sổ (Notepad ++), nó sẽ khớp mọi thứ sau' đầu tiên cho đến cuối dòng cuối cùng.

Để nắm bắt tất cả mọi thứ cho đến cuối dòng mà tôi gõ như sau:

'.*?\n 

này sẽ chỉ chụp tất cả mọi thứ từ 'đến cuối dòng đó.

2

Trong ví dụ của bạn tôi muốn đi cho mô hình sau:

'([^\n]+)$ 

sử dụng nhiều dòng và các tùy chọn toàn cầu để phù hợp với tất cả các lần xuất hiện.

Để bao gồm các linefeed trong trận đấu bạn có thể sử dụng:

'[^\n]+\n 

Nhưng điều này có thể bỏ lỡ những dòng cuối cùng nếu nó không có linefeed.

Đối với một dòng duy nhất, nếu bạn không cần phải phù hợp với linefeed Tôi muốn sử dụng:

'[^$]+$ 
Các vấn đề liên quan