Biểu thức thông thường - Kết hợp mọi thứ


278

Làm thế nào để tôi thực hiện một biểu thức để khớp hoàn toàn mọi thứ (bao gồm cả khoảng trắng)?
Thí dụ:

Regex: Tôi đã mua _____ cừu.

Các trận đấu: Tôi đã mua cừu. Tôi đã mua một con cừu. Tôi đã mua năm con cừu.

Tôi đã thử sử dụng (.*), nhưng dường như nó không hoạt động.

Cập nhật: Tôi đã làm cho nó hoạt động, rõ ràng vấn đề không nằm ở các biểu thức thông thường, chỉ là các ký tự (.) Đã được thoát.


27
.*nên làm việc. Bạn có thể dán mã thực tế của bạn?
Jacob Eggers

2
Ngôn ngữ nào bạn đang mã hóa?
Ziggy

9
một dấu chấm sẽ không khớp với một dòng mới
zee

Câu trả lời:


293

Thông thường dấu chấm phù hợp với bất kỳ ký tự nào ngoại trừ dòng mới .

Vì vậy, nếu .*không hoạt động, hãy đặt tùy chọn "chấm cũng khớp với dòng mới" (hoặc sử dụng (?s).*).

Nếu bạn đang sử dụng JavaScript, không có tùy chọn "dotall", hãy thử [\s\S]*. Điều này có nghĩa là "khớp với bất kỳ số lượng ký tự nào là khoảng trắng hoặc không phải khoảng trắng" - thực sự "khớp với bất kỳ chuỗi nào".

Một tùy chọn khác chỉ hoạt động với JavaScript (và không được nhận ra bởi bất kỳ hương vị regex nào khác) là [^]*cũng phù hợp với bất kỳ chuỗi nào. Nhưng [\s\S]*dường như được sử dụng rộng rãi hơn, có lẽ vì nó dễ mang theo hơn.


7
.*không khớp \nnhưng nó xử lý một chuỗi chỉ chứa \nbởi vì nó khớp với 0 ký tự.
Toto

1
nếu sử dụng Javascript, đừng quên gạch chéo khi đặt biến cho mẫu này, ví dụ: var pattern = "[\\ s \\ S] *";
Gấu Astra

các (?s).*tác phẩm đối với tôi phù hợp với tất cả mọi thứ, kể cả dòng mới
Gujarat Santana

1
Có một VẤN ĐỀ với việc sử dụng / [\ s \ S] * /. Nếu bạn sử dụng nó trong mã của mình và sau đó nhận xét mã đó gây ra lỗi cú pháp vì phần cuối của mẫu được lấy có nghĩa là phần cuối của nhận xét. Sau đó, bạn cần xóa mẫu đó khỏi mã nhận xét để làm cho nó hoạt động. Nhưng sau đó nếu bạn không bình luận lại, nó sẽ không hoạt động nữa hoặc không hoạt động như trước đây và nên làm.
Panu Logic

Đây sẽ là trường hợp với bất kỳ regex kết thúc bằng dấu hoa thị. Tất nhiên, thật dễ dàng để tránh bằng cách thêm một cái gì đó sau *(như trong /.*(?:)/) hoặc sử dụng hàm tạo regex ( var foo = new RegExp(".*")).
Tim Pietzcker

177

(.*?) phù hợp với bất cứ điều gì - tôi đã sử dụng nó trong nhiều năm.


61
Nhưng điều đó có phù hợp với một dòng mới?
ineedahero

Tôi đã sử dụng điều này trên Sublime Text và nó hoạt động hoàn hảo. Cảm ơn! ("title":".*?")
SCabralO

8
Trong Javascript, sử dụng [\s\S]*hoặc [^]*.
Jeff Huijsmans

Tôi không biết nhưng mỗi khi tôi sử dụng biểu thức này, tôi cảm thấy có lỗi, vì đã không thể hiện một biểu thức cụ thể cho trường hợp sử dụng của mình. Nếu nói, w+không đủ, tôi sẽ sử dụng .+. May mắn đã không quay lại cắn tôi.
Tushar

Hoạt động với tôi bằng Python
acha

89

Chọn và ghi nhớ 1 trong những điều sau đây !!! :)

[\s\S]*
[\w\W]*
[\d\D]*

Giải trình:

\s: khoảng trắng \S: không phải khoảng trắng

\w: từ \W: không phải từ

\d: chữ số \D: không phải chữ số

(Bạn có thể trao đổi *cho +nếu bạn muốn 1 hoặc nhiều ký tự [thay vì từ 0 trở lên]).




TIỀN THƯỞNG TIỀN THƯỞNG:

Nếu bạn muốn khớp mọi thứ trên một dòng, bạn có thể sử dụng:

[^\n]+

Giải trình:

^: không phải

\n: ngắt dòng

+: cho 1 ký tự trở lên



6

Sử dụng .*và đảm bảo rằng bạn đang sử dụng tương đương với một dòng của triển khai để bạn sẽ khớp với các kết thúc dòng .

Có một lời giải thích tuyệt vời ở đây -> http://www.THER-expressions.info/dot.html


4

Bởi vì .Tìm một ký tự đơn, ngoại trừ dòng kết thúc hoặc dòng kết thúc.

Vì vậy, để phù hợp với bất cứ điều gì, bạn có thể sử dụng như thế này: (.|\n)*?

Hy vọng nó giúp!


2

(.*?)không làm việc cho tôi. Tôi đang cố gắng khớp các bình luận được bao quanh bởi /* */, có thể chứa nhiều dòng.

Thử cái này:

([a]|[^a])

Regex này phù hợp ahoặc anything else expect a. Hoàn toàn, nó có nghĩa là phù hợp với tất cả mọi thứ.

BTW, trong tình huống của tôi, /\*([a]|[^a])*/phù hợp với ý kiến ​​kiểu C.

Cảm ơn @mpen cho một cách ngắn gọn hơn.

[\s\S]

1
Cách phổ biến nhất để làm điều này trong JS là [\s\S]- tức là khớp các khoảng trắng và không khoảng trắng.
mở

2

Đối với JavaScript, câu trả lời tốt nhất và đơn giản nhất dường như là /.*/.

Theo đề xuất của người khác /(.*?)/ cũng sẽ hoạt động nhưng /.*/ thì đơn giản hơn. () Bên trong mẫu không cần thiết, theo như tôi có thể thấy cũng như kết thúc? để khớp hoàn toàn mọi thứ (kể cả chuỗi rỗng)

KHÔNG GIẢI PHÁP:

/ [\ s \ S] / KHÔNG khớp với các chuỗi trống nên đó không phải là giải pháp.

/ [\ s \ S] * / DOES cũng khớp với các chuỗi trống. Nhưng nó có một vấn đề: Nếu bạn sử dụng nó trong mã của mình thì bạn không thể nhận xét mã đó vì '* /' được hiểu là kết thúc nhận xét.

/ ([\ s \ S] *) / hoạt động và không có vấn đề bình luận. Nhưng nó dài hơn và phức tạp hơn để hiểu hơn /.*/.


BTW. có vẻ như các đoạn trích ở trên làm cho Stack Overflow hiển thị các phần câu trả lời của tôi in nghiêng, đó không phải là ý định của tôi.
Panu Logic

1

Nếu bạn đang sử dụng JavaScript, ES2018 đã thêm cờ s (dot ALL). Với scờ, dấu chấm .sẽ khớp với bất kỳ ký tự nào bao gồm dòng mới.

console.log("line_1\nline_2".match(/.+/s))

Lưu ý : Nó chưa được hỗ trợ trong một số trình duyệt.


1

Đặc tả năm 2018 cung cấp cờ s (bí danh: dot ALL), do đó .sẽ khớp với bất kỳ ký tự nào, bao gồm cả ngắt dòng:

const regExAll = /.*/s; //notice the 's'

let str = `
Everything
	in 	this
			string
					will
						be
	matched. Including whitespace (even Linebreaks).
`;

console.log(`Match:`, regExAll.test(str)); //true
console.log(`Index Location:`, str.search(regExAll));

let newStr = str.replace(regExAll,"🐔");
console.log(`Replaced with:`,newStr); //Index: 0

Đoạn mã trên hoạt động trong Chrome, nhưng scờ chưa được triển khai trong Firefox, nhưng nó sẽ sớm ra mắt .



0

Tôi khuyên bạn nên sử dụng /(?=.*...)/g

Thí dụ

const text1 = 'I am using regex';
/(?=.*regex)/g.test(text1) // true

const text2 = 'regex is awesome';
/(?=.*regex)/g.test(text2) // true

const text3 = 'regex is util';
/(?=.*util)(?=.*regex)/g.test(text3) // true

const text4 = 'util is necessary';
/(?=.*util)(?=.*regex)/g.test(text4) // false because need regex in text

Sử dụng regex101 để kiểm tra


0

Thành thật rất nhiều câu trả lời đã cũ nên tôi thấy rằng nếu bạn chỉ cần kiểm tra bất kỳ chuỗi nào bất kể nội dung ký tự với "/.*/i" sẽ đủ nhận được MỌI THỨ.

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.