Điều gì Regex sẽ nắm bắt mọi thứ từ dấu 'đến cuối dòng?


122

Tôi có một tệp văn bản biểu thị nhận xét bằng một tệp duy nhất '.

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 a 'và dòng cấp dữ liệu.

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

Câu trả lời:


169
'.*

Tôi tin rằng bạn cần tùy chọn, Multiline.


3
Điều này sẽ ghi lại phiên bản đầu tiên của nhân vật 'và cuối dòng cuối cùng
killdaclick vào

90

Regex thích hợp sẽ là 'ký tự được theo sau bởi bất kỳ số ký tự nào [bao gồm ký tự không] kết thúc bằng dấu cuối chuỗi / mã thông báo dòng:

'.*$

Và nếu bạn muốn chụp mọi thứ sau ký tự 'nhưng không đưa nó vào đầu ra, bạn sẽ sử dụng:

(?<=').*$

Về cơ bản, điều này nói cho tôi tất cả các ký tự theo sau ký tự 'cho đến cuối dòng.

Chỉnh sửa : Đã lưu ý rằng $ ẩn khi sử dụng. * Và do đó không được yêu cầu nghiêm ngặt, do đó mẫu:

'.* 

về mặt kỹ thuật là đúng, tuy nhiên rõ ràng hơn là cụ thể và tránh nhầm lẫn cho việc bảo trì mã sau này, do đó tôi sử dụng $. Tôi tin rằng luôn luôn tốt hơn khi tuyên bố hành vi rõ ràng hơn là dựa vào hành vi ngầm trong các tình huống mà sự rõ ràng có thể bị nghi ngờ.


1
$ Là không cần thiết. Dấu chấm sẽ dừng ở cuối dòng trong 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ó như một lời nhắc nhở sau này rằng nó đang mong đợi mọi thứ từ 'đến cuối dòng
gnarf

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

@Tomalak: Không phải cố ngụ ý rằng bạn đã sai bằng bất kỳ cách nào, chỉ đang làm rõ lý do của tôi cho lựa chọn sử dụng $ chứ không phải là không. Cảm ơn vì chỉ ra điều ấy.
BenAlabaster

+1 để bao gồm cách bao gồm mọi thứ sau ký tự được đề cập, thay vì luôn bao gồm nó.
Grizzasd

22
'.*$

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


Câu trả lời này là một ví dụ tuyệt vời về cách phá vỡ logic đằng sau một lệnh, hay và rõ ràng!
Timmah

12

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

Để nắm bắt mọi thứ cho đến cuối dòng đó, tôi đã nhập như sau:

'.*?\n

Điều này sẽ chỉ nắm bắt mọi thứ từ 'cho đến cuối dòng đó.


6

Trong ví dụ của bạn, tôi sẽ đi theo mẫu sau:

'([^\n]+)$

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

Để đưa nguồn cấp dữ liệu vào trận đấu, bạn có thể sử dụng:

'[^\n]+\n

Nhưng điều này có thể bỏ lỡ dòng cuối cùng nếu nó không có nguồn cấp dữ liệu.

Đối với một dòng duy nhất, nếu bạn không cần khớp với dòng cấp dữ liệu, tôi muốn sử dụng:

'[^$]+$

4

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

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

Sửa đổi nhanh chóng: nếu dòng không có '- backreference 1 sẽ vẫn bắt được 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

0

https://regex101.com/r/Jjc2xR/1

/(\w*\(Hex\): w*)(.*?)(?= |$)/gm

Tôi chắc chắn rằng cái này hoạt động, nó sẽ bắt nối tiếp de hexa trong văn bản có cấu trúc tồi tệ có nhiều đường

     Space Reservation: disabled
         Serial Number: wCVt1]IlvQWv
   Serial Number (Hex): 77435674315d496c76515776
               Comment: new comment

Tôi là một người mới vĩnh cửu trong regex nhưng tôi sẽ cố gắng giải thích điều này

(\ w * (Hex): w *): Tìm văn bản trong dòng chứa chuỗi "Hex:"

(. *?) Đây là văn bản được chụp thứ hai và có nghĩa là mọi thứ sau

(? = | $) tạo ra một giới hạn là khoảng trắng giữa dấu = và dấu |

Vì vậy, với nhóm thứ hai, bạn sẽ có giá trị


Đó không phải là câu hỏi, phải không?
Daniel E.
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.