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.


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 .


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.


^((?!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


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>

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.