Ekspresi Reguler - Cocokkan Apapun

279

Bagaimana cara membuat ekspresi yang benar-benar cocok dengan apa pun (termasuk spasi putih)?
Contoh:

Regex: Saya membeli _____ domba.

Cocok: Saya membeli domba. Saya membeli domba. Saya membeli lima domba.

Saya mencoba menggunakan (.*), tetapi sepertinya itu tidak berhasil.

Pembaruan: Saya berhasil, ternyata masalahnya bukan pada ekspresi reguler, hanya saja (.) Karakternya yang lolos.

Pejalan
sumber
27
.*harus bekerja. Bisakah Anda menempelkan kode Anda yang sebenarnya?
Jacob Eggers
2
Bahasa apa yang Anda kode?
Ziggy
9
sebuah titik tidak akan cocok dengan baris baru
zee

Jawaban:

294

Biasanya titik cocok dengan karakter apa pun kecuali baris baru .

Jadi jika .*tidak berfungsi, atur opsi "dot cocok dengan baris baru" (atau gunakan (?s).*).

Jika Anda menggunakan JavaScript, yang tidak memiliki opsi "dotall", coba [\s\S]*. Ini berarti "cocok dengan sejumlah karakter apa pun yang merupakan spasi putih atau non-spasi putih" - secara efektif "cocok dengan string apa pun".

Opsi lain yang hanya berfungsi untuk JavaScript (dan tidak dikenali oleh rasa regex lainnya) adalah [^]*yang juga cocok dengan string apa pun. Namun [\s\S]*sepertinya lebih banyak digunakan, mungkin karena lebih portable.

Tim Pietzcker
sumber
7
.*tidak cocok \ntetapi menghasilkan string yang berisi hanya \nkarena cocok dengan 0 karakter.
Toto
1
jika menggunakan Javascript jangan lupa untuk memangkas garis miring ketika mengatur variabel ke pola ini misalnya: var pattern = "[\\ s \\ S] *";
Astra Bear
(?s).*karya - karya untuk saya cocok dengan semuanya termasuk baris baru
Gujarat Santana
1
Ada MASALAH dengan menggunakan / [\ s \ S] * /. Jika Anda menggunakannya dalam kode Anda dan kemudian mengomentari kode tersebut yang menyebabkan kesalahan sintaksis karena akhir dari pola diambil berarti akhir dari komentar. Anda kemudian perlu menghapus pola itu dari kode komentar untuk membuatnya berfungsi. Tetapi kemudian jika Anda pernah berhenti mengomentari lagi itu tidak akan berfungsi lagi, atau tidak berfungsi seperti dulu, dan seharusnya.
Panu Logic
Ini akan menjadi kasus dengan regex yang berakhir dengan tanda bintang. Tentu saja mudah dihindari dengan menambahkan sesuatu setelah *(seperti pada /.*(?:)/) atau menggunakan konstruktor regex ( var foo = new RegExp(".*")).
Tim Pietzcker
177

(.*?) cocok dengan apa pun - Saya telah menggunakannya selama bertahun-tahun.

jdixon2614
sumber
61
tetapi apakah itu cocok dengan baris baru?
ineedahero
Saya menggunakan ini pada Teks Sublim dan itu bekerja dengan sempurna. Terima kasih! ("title":".*?")
SCabralO
8
Dalam Javascript, gunakan [\s\S]*atau [^]*.
Jeff Huijsmans
Saya tidak tahu tetapi setiap kali saya menggunakan ungkapan ini, saya merasa bersalah, karena tidak membuat ekspresi spesifik untuk kasus penggunaan saya. Jika mengatakan, w+tidak cukup, saya akhirnya menggunakan .+. Untungnya belum kembali untuk menggigitku.
Tushar
Bekerja untuk saya menggunakan Python
suffa
90

Pilih & ingat 1 dari yang berikut ini !!! :)

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

Penjelasan:

\s: whitespace \S: bukan whitespace

\w: kata \W: bukan kata

\d: digit \D: bukan digit

(Anda dapat bertukar *untuk +jika Anda ingin 1 atau LEBIH karakter [bukan 0 atau lebih]).




BONUS EDIT:

Jika Anda ingin mencocokkan semuanya dalam satu baris, Anda dapat menggunakan ini:

[^\n]+

Penjelasan:

^: tidak

\n: linebreak

+: untuk 1 karakter atau lebih

Tyler
sumber
21

Coba ini:

I bought (.* )?sheep

atau bahkan

I bought .*sheep
Mike Mozhaev
sumber
4

Karena .Temukan karakter tunggal, kecuali baris baru atau terminator garis.

Jadi, untuk mencocokkan apa pun, Anda dapat menggunakan seperti ini: (.|\n)*?

Semoga ini bisa membantu!

Sang Huynh
sumber
2

(.*?)tidak bekerja untuk saya. Saya mencoba mencocokkan komentar yang dikelilingi oleh /* */, yang mungkin berisi banyak baris.

Coba ini:

([a]|[^a])

Regex ini cocok dengan aatau anything else expect a. Tentu saja, itu berarti mencocokkan segalanya.

BTW, dalam situasi saya, /\*([a]|[^a])*/cocok dengan komentar gaya C.

Terima kasih @mpen untuk cara yang lebih ringkas.

[\s\S]
oryxfea
sumber
1
Cara paling umum untuk melakukan ini di JS adalah [\s\S]- yaitu ruang pertandingan dan non-spasi.
mpen
2

Untuk JavaScript, jawaban terbaik dan paling sederhana adalah /.*/.

Seperti yang disarankan oleh orang lain /(.*?)/ akan bekerja dengan baik tetapi /.*/ lebih sederhana. () Di dalam pola tidak diperlukan, sejauh yang saya bisa lihat atau akhirnya? benar-benar cocok dengan apa pun (termasuk string kosong)

NON-SOLUSI:

/ [\ s \ S] / TIDAK cocok dengan string kosong jadi itu bukan solusinya.

/ [\ s \ S] * / TIDAK cocok juga dengan string kosong. Tetapi memiliki masalah: Jika Anda menggunakannya dalam kode Anda maka Anda tidak dapat berkomentar kode seperti itu karena '* /' ditafsirkan sebagai akhir-komentar.

/ ([\ s \ S] *) / berfungsi dan tidak memiliki masalah komentar. Tetapi lebih lama dan lebih rumit untuk dipahami daripada /.*/.

Panu Logic
sumber
BTW. sepertinya kutipan kode di atas membuat Stack Overflow membuat bagian jawaban saya dalam huruf miring, itu bukan maksud saya.
Panu Logic
1

Jika Anda menggunakan JavaScript, ES2018 menambahkan tanda (dotAll). Dengan sbendera, titik .akan cocok dengan karakter apa pun termasuk baris baru.

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

Catatan : Ini belum didukung di beberapa browser.

Cuong Le Ngoc
sumber
1

Spesifikasi 2018 menyediakan bendera s (alias: dotAll), sehingga .akan cocok dengan karakter apa pun, termasuk linebreak:

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

Kode di atas berfungsi di Chrome, tetapi sbender belum diimplementasikan di Firefox, tetapi akan segera dilakukan .

Lonnie Best
sumber
0

Saya merekomendasikan penggunaan /(?=.*...)/g

Contoh

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

Gunakan regex101 untuk menguji

Alex Montoya
sumber
0

Jujur banyak jawaban sudah tua jadi saya menemukan bahwa jika Anda hanya cukup menguji string apa pun terlepas dari konten karakter dengan "/.*/i" akan cukup mendapatkan SEMUA.

kjohnsonthecoder
sumber