2016-08-19 27 views
9

Trên cuốn sách Mã thông báo JavaScriptchapter 9: Regular Expressions trong phần "Phân tích tệp INI" có ví dụ bao gồm cụm từ thông dụng, tôi không hiểu gì cả. Tác giả đang cố gắng để phân tích nội dung tiếp theo:Sự khác biệt giữa hai biểu thức chính quy này là gì? (Hiểu? Trình định lượng)

searchengine=http://www.google.com/search?q=$1 
spitefulness=9.7 

; comments are preceded by a semicolon... 
; each section concerns an individual enemy 
[larry] 
fullname=Larry Doe 
type=kindergarten bully 
website=http://www.geocities.com/CapeCanaveral/11451 

[gargamel] 
fullname=Gargamel 
type=evil sorcerer 
outputdir=/home/marijn/enemies/gargamel 

Trên quy tắc cho nhà nước định dạng này mà

dòng trống và dòng bắt đầu bằng dấu chấm phẩy được bỏ qua.

Mã phân tích nội dung này đi qua mọi dòng trong tệp. Để xử lý các ý kiến, ông bao gồm biểu hiện này

^\s*(;.*)? 

Theo như tôi hiểu, quá trình biểu hiện này dòng có thể bắt đầu với một chuỗi các

ký tự khoảng trắng, trong đó có không gian, tab, hình thức thức ăn chăn nuôi, thức ăn đường và gian Unicode khác

(source) cho đến khi nó xuất hiện một dấu chấm phẩy ; và sau đó một chuỗi "bất kỳ ký tự đơn nào ngoại trừ các ký tự dòng: \ n, \ r, \ u2028 hoặc \ u2029.". Tất cả điều này chỉ giới hạn ở {0,1} lần xuất hiện.

Tôi không nhận được điểm định lượng ? tại đây. Tôi không thể tìm thấy (regex101) mọi trường hợp không giới hạn sự xuất hiện của chuỗi trùng khớp có thể là một vấn đề. Tại sao biểu thức khác với biểu thức này:

^\s*(;.*) 

Xin cảm ơn trước.

Trả lời

6

^\s*(;.*) yêu cầu số ;, không được khớp với dòng trống.

^\s*(;.*)? có thể khớp với một dòng trống, nó không yêu cầu ;.

Phần chung là ^\s* - bắt đầu dòng (hoặc chuỗi) và sau đó là 0 hoặc nhiều khoảng trắng.

Sau đó 1) (;.*) phù hợp với một trường hợp ; (1 bắt buộc phải có) và sau đó không hoặc nhiều ký tự khác dòngmới, và 2) (;.*)? phù hợp với một tùy chọn chuỗi (các (...)? là một nhóm tùy chọn vì ? là một lượng hóa phù hợp với một hoặc 0 lần xuất hiện của nguyên tử được định lượng, trong khi nguyên mẫu có thể là một biểu tượng, một lớp nhân vật, một nhóm ) của một ; theo sau với 0+ ký tự khác với dòng mới.Ngoài ra, lưu ý rằng \s khớp với các ký hiệu LF và CR và điều đó có nghĩa là (nếu biến tố MULTILINE BẬT và đầu vào là một văn bản có chứa nhiều dòng) thì regex ^\s* có thể khớp trên nhiều dòng cho đến khoảng trắng đầu tiên. tính cách.

+0

Văn bản trên trang được liên kết cho biết đầu vào được chia thành các dòng, vì vậy chế độ nhiều dòng không được sử dụng và không có dòng mới cho '\ s *' để khớp. (Điều đó cũng thu hút sự chú ý của tôi.) –

+0

Tốt, tôi đã sửa đổi câu trả lời thành * (nếu công cụ sửa đổi MULTILINE BẬT và đầu vào là một văn bản có chứa nhiều dòng) *. Đó là một lưu ý chung cho độc giả trong tương lai. –

+1

Cảm ơn. Tôi nhớ, biểu hiện cũng phải phù hợp với những dòng trống. Cảm ơn bạn đã trả lời quá nhanh. –

2

Regex cuối cùng đã sửa đổi của bạn yêu cầu dấu chấm phẩy. Regex gốc sẽ khớp với các dòng chỉ là khoảng trắng.

Vì mục đích (nếu tôi hiểu chính xác) là bỏ qua các dòng khớp với regex này (như - có vẻ bề ngoài - dòng nhận xét), nên cũng bỏ qua các dòng trống.

+0

Cảm ơn. Bình luận của bạn củng cố sự hiểu biết của tôi! –

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