2015-09-11 19 views
11

Tôi đang đọc mã nguồn của Ionic. Tôi đã xem qua regex này, và tôi "đang khá bối rối bởi nó.Sự khác biệt giữa các regexes

([\s\S]+?) 

Ok, nó nhóm trên mỗi char đó là hoặc là một khoảng trắng, hoặc khoảng trắng không ???

Tại sao didn' t họ chỉ làm

(.+?) 

tôi có thiếu cái gì?

+6

vì dấu chấm không khớp với ký tự dòng mới '\ n' –

Trả lời

11

Các . trận đấu bất kỳ biểu tượng mà là một dòng mới. để làm cho nó phù hợp với một dòng mới, trong hầu hết các ngôn ngữ có một modifier (dotall , singleline). Tuy nhiên, trong JS, không có trình sửa đổi nào như vậy.

Do đó, công việc xung quanh là sử dụng một lớp nhân vật [\s\S] khớp với bất kỳ ký tự nào, kể cả dòng mới, vì \s sẽ khớp với tất cả khoảng trắng và \S sẽ khớp với tất cả các ký tự không khoảng trắng. Tương tự, người ta có thể sử dụng [\d\D] hoặc [\w\W].

Ngoài ra, có một mẫu [^] để khớp với cùng một thứ trong JS, nhưng vì nó là JavaScript cụ thể, các regex có chứa mẫu này không di động giữa các hương vị regex.

+? Bộ quan sát lười phù hợp với 1 hoặc nhiều ký hiệu phù hợp với mẫu con trước đó, nhưng ít nhất có thể. Do đó, nó sẽ chỉ khớp với 1 biểu tượng nếu được sử dụng như thế này, ở cuối mẫu.

+0

Chỉ để hoàn thành: công cụ sửa đổi * dotall/singleline * thường' s' trong hương vị khác. –

+0

Hoặc '/ m' trong Ruby. –

+0

** Argh! ** - 'm' có nghĩa là một cái gì đó hoàn toàn khác trong các hương vị khác (bao gồm JS) ... Tại sao họ không dính vào' s'? : - \ Họ cũng đặt tên nó là «Regexp :: MULTILINE' không giống với' PCRE2_MULTILINE'. Nice gotcha ở đây. Nguyên tắc của sự ngạc nhiên ít nhất bạn nói? ;-) –

3

A . khớp với mọi thứ nhưng ký tự dòng mới. Đây thực sự là một vấn đề được biết đến/ghi lại với javascript. \s (kết hợp khoảng trắng) cùng với số phủ định \S (kết hợp không gian trắng) cung cấp kết quả phù hợp dotall bao gồm cả dòng mới. Do đó, [\s\S] thường được sử dụng thường xuyên hơn .

3

Trong nhiều lần thực hiện Regexp "." không khớp với các dòng mới. Vì vậy, họ sử dụng "[\ s \ S]" dưới dạng một chút hack =)

1

RegEx họ sử dụng bao gồm nhiều ký tự hơn (chủ yếu là mọi thứ).

\s khớp với bất kỳ từ hoặc ký tự chữ số hoặc khoảng trắng nào.

\S phù hợp với bất cứ điều gì ngoại trừ một chữ số, nhân vật từ, hoặc khoảng trắng

Như Casimir lưu ý:

. trận đấu bất kỳ ký tự trừ newline (\n)

1

. trận đấu bất kỳ char trừ vận chuyển trở lại /r và dòng mới /n

Cách ngắn nhất để làm [/s/S] (không gian màu trắng và không gian trắng) là [^] (không phải là không có gì)

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