Operator ekspresi reguler manakah yang berarti 'Jangan' cocok dengan karakter ini?

91

*, ?, +karakter semua berarti cocok dengan karakter ini. Karakter mana yang berarti 'jangan' cocok dengan ini? Contoh akan membantu.

Klik Suka
sumber
Untuk solusi yang berkaitan dengan tidak mencocokkan kata - Lihat di sini stackoverflow.com/questions/406230
null

Jawaban:

92

Anda dapat menggunakan kelas karakter yang dinegasikan untuk mengecualikan karakter tertentu: misalnya [^abcde]akan cocok dengan apa pun kecuali karakter a, b, c, d, e.

Alih-alih menentukan semua karakter secara harfiah, Anda dapat menggunakan singkatan di dalam kelas karakter: [\w](huruf kecil) akan cocok dengan "karakter kata" (huruf, angka dan garis bawah), [\W](huruf besar) akan cocok dengan apa pun kecuali karakter kata; demikian pula, [\d]akan cocok dengan angka 0-9 sementara [\D]cocok dengan apapun kecuali angka 0-9, dan seterusnya.

Jika Anda menggunakan PHP, Anda dapat melihat dokumentasi kelas karakter regex .

Paolo Stefan
sumber
82

Ada dua cara untuk mengatakan "jangan cocok": rentang karakter, dan lookahead / lookbehind negatif lebar-nol.

Mantan: tidak cocok a, b, catau 0:[^a-c0]

Yang terakhir: cocokkan string tiga huruf apa pun kecuali foodan bar:

(?!foo|bar).{3}

atau

.{3}(?<!foo|bar)

Juga, koreksi untuk Anda: *, ?dan +tidak benar-benar cocok apa-apa. Mereka adalah operator pengulangan, dan selalu mengikuti operator yang cocok. Dengan demikian, a+berarti mencocokkan satu atau lebih dari a, [a-c0]+berarti mencocokkan satu atau lebih dari a, b, catau 0, sementara [^a-c0]+akan mencocokkan satu atau lebih dari apa pun yang tidak a, b, catau 0.

Amadan
sumber
^((?!foo).)+$Cocokkan baris mana pun yang tidak mengandung foo regex101.com/r/z6a65l/4
Levi Baguley
49

[^] (dalam [] ) adalah negasi dalam ekspresi reguler sedangkan ^"awal string"

[^a-z] cocok dengan karakter tunggal apa pun yang bukan dari "a" hingga "z"

^[a-z] artinya string dimulai dengan dari "a" hingga "z"

Referensi

diEcho
sumber
9

^ digunakan di awal rentang karakter, atau pernyataan lookahead / lookbehind negatif.

>>> re.match('[^f]', 'foo')
>>> re.match('[^f]', 'bar')
<_sre.SRE_Match object at 0x7f8b102ad6b0>
>>> re.match('(?!foo)...', 'foo')
>>> re.match('(?!foo)...', 'bar')
<_sre.SRE_Match object at 0x7f8b0fe70780>
Ignacio Vazquez-Abrams
sumber
Apakah Anda harus menggunakan ?!dalam 2 contoh terakhir atau dapatkah Anda menggunakannya !sendiri? Apa yang ?dilakukan disana?
Klik Suara Positif
Python membutuhkan ?untuk memberi tahu bahwa itu adalah ekstensi. Mesin regex lain mungkin memiliki aturannya sendiri.
Ignacio Vazquez-Abrams
@ Klik: Ini cukup standar. regular-expressions.info/refadv.html , juga sebagian besar manual mesin regexp mengatakan hal yang sama.
Amadan