Saya membutuhkan regex yang dapat mencocokkan semuanya kecuali string yang dimulai dengan pola tertentu (khusus index.phpdan apa yang mengikuti, seperti index.php?id=2342343)
@ThomasOwens: Tergantung. Itu tergantung pada bagian mana dari ekspresi harus dinegasikan. Jika seluruh ekspresi harus dinegasikan, maka Anda mendapat poin. Misalnya, jika Anda ingin membuat kode "jika string tidak mengandung 'Bruce' sebagai substring, maka lakukan sesuatu", Anda akan menggunakan plain / Bruce /, dan memasukkan negasi ke dalam pernyataan if, di luar regex . Tapi bisa jadi Anda ingin meniadakan beberapa subekspresi. Katakanlah, Anda mencari sesuatu seperti nama belakang nama belakang, di mana nama depan adalah Bruce, dan nama belakang adalah segalanya kecuali XYZ, di mana XYZ adalah nama terakhir dari beberapa selebriti bernama Bruce.
mathheadinclouds
Jawaban:
250
Bukan ahli regexp, tapi saya pikir Anda bisa menggunakan lookahead negatif dari awal, misalnya ^(?!foo).*$tidak harus cocok dengan apa pun yang dimulai dengan foo.
Mesin lain yang memungkinkan pencarian: (cat)|[^c]*(?:c(?!at)[^c]*)*(atau (?s)(cat)|(?:(?!cat).)*, atau (cat)|[^c]+(?:c(?!at)[^c]*)*|(?:c(?!at)[^c]*)+[^c]*) dan kemudian memeriksa dengan bahasa berarti: jika Grup 1 cocok, itu bukan yang kita butuhkan, atau ambil nilai kecocokan jika tidak kosong
sebuah karakter tunggal tertentu atau sekumpulan karakter :
Catatan demo : baris baru \ndigunakan di dalam kelas karakter yang dinegasikan dalam demo untuk menghindari kecocokan pencocokan dengan baris tetangga. Mereka tidak perlu saat menguji string individu.
Catatan jangkar : Dalam banyak bahasa, gunakan \Auntuk mendefinisikan awal string yang jelas, dan \z(dalam Python \Z, dalam JavaScript, $adalah OK) untuk menentukan bagian paling akhir dari string.
Dot note : Dalam banyak rasa (tapi bukan POSIX, TRE, TCL), .cocok dengan char apa pun kecuali char baris baru . Pastikan Anda menggunakan pengubah DOTALL yang sesuai ( /sdi PCRE / Boost / .NET / Python / Java dan /mdi Ruby) .agar sesuai dengan karakter apa pun termasuk baris baru.
Catatan\n garis miring terbalik : Dalam bahasa di mana Anda harus mendeklarasikan pola dengan string C yang memungkinkan urutan pelarian (seperti untuk baris baru), Anda perlu menggandakan garis miring terbalik yang keluar dari karakter khusus sehingga mesin dapat memperlakukan mereka sebagai karakter literal (misalnya di Jawa, world\.akan menjadi dinyatakan sebagai "world\\.", atau menggunakan kelas karakter:) "world[.]". Gunakan literal string mentah (Python r'\bworld\b'), literal string C # verbatim @"world\.", atau string slashy / regex notasi literal seperti /world\./.
Tulis hebat! Untuk kasus "string (tidak) sama dengan beberapa string", dengan contoh ^(?!foo$), mengapa tanda dolar harus berada dalam tanda kurung agar ekspresi tersebut berfungsi? Saya mengharapkan ^(?!foo)$untuk memberikan hasil yang sama, tetapi tidak.
Grant Humphries
3
@GrantHumphries: Ketika $jangkar berada di dalam lookahead, itu adalah bagian dari kondisi, bagian dari pernyataan lebar nol itu . Jika berada di luar, seperti di ^(?!foo)$, itu akan menjadi bagian dari pola konsumsi yang membutuhkan akhir string tepat setelah awal string, membuat tampilan negatif tidak relevan karena akan selalu kembali benar (tidak ada teks setelah akhir string , apalagi foo). Jadi, ^(?!foo$)kecocokan mulai dari string yang tidak diikuti dengan fooyang diikuti dengan akhir string. ^(?!foo)$cocok dengan string kosong.
Wiktor Stribiżew
@ robots.txt Harap hapus komentar ini. Anda mengajukan pertanyaan XY. Kelas karakter dimaksudkan untuk mencocokkan karakter tunggal, tidak ada cara untuk menentukan urutan karakter. Anda mungkin harus menemukan substring antara awal string dan kemunculan pertama cotatau lan, dan menghapus kecocokan, seperti regex.replace(myString, "^.*?(?:cot|lan)\s*", "").
Wiktor Stribiżew
Wiktor yang terhormat. Anda telah menutup pertanyaan saya namun jawaban yang ditautkan gagal. Saya telah memperbarui pertanyaan saya stackoverflow.com/questions/60004380/…
MonsterMMORPG
Misalnya jawaban tertaut Anda gagal pada contoh ini "paket <! - dan halaman web <! - asdasasdas -> editor sekarang menggunakan -> Lorem Ipsum"
MonsterMMORPG
259
Anda dapat menempatkan a ^di awal set karakter untuk mencocokkan apa pun kecuali karakter tersebut.
Itu benar, tetapi hanya memproses satu karakter pada satu waktu. Jika Anda ingin mengecualikan urutan dua karakter atau lebih, Anda harus menggunakan lookahead negatif seperti kata responden lainnya.
Alan Moore
solusi sempurna dan menghapus karakter yang tidak diinginkan selain yang ada dalam pola terima kasih
Sirmyself
@Lan, "... kamu harus menggunakan lookahead negatif ..." salah, tapi kami tidak boleh terlalu keras padamu karena Wiktor tidak memposting jawabannya - yang menunjukkan mengapa - sampai 2016.
Cary Swoveland
6
Cocokkan saja /^index\.php/lalu tolak apa pun yang cocok dengannya.
Aku butuh mampu regex untuk mencocokkan segalanya tapi kecuali sebuah string yang dimulai denganindex.php pola tertentu (khusus index.php dan apa yang berikut, seperti index.php? Id = 2.342.343)
OP secara khusus meminta regex ... Saya tidak yakin ini bisa membantu! (Dia mungkin menggunakan greppada command-line, misalnya, atau Perl / Python / bahasa lain, atau perintah "Jalankan regex ini untuk setiap baris" dalam editor teks, dll ...)
Jawaban:
Bukan ahli regexp, tapi saya pikir Anda bisa menggunakan lookahead negatif dari awal, misalnya
^(?!foo).*$
tidak harus cocok dengan apa pun yang dimulai denganfoo
.sumber
^((?!foo).)*$
( stackoverflow.com/a/406408/3964381 )Regex: cocokkan semua kecuali :
foo
):^(?!foo).*$
^(?!foo)
^(([^f].{2}|.[^o].|.{2}[^o]).*|.{0,2})$
^([^f].{2}|.[^o].|.{2}[^o])|^.{0,2}$
world.
di akhir):(?<!world\.)$
^.*(?<!world\.)$
^(.*([^w].{5}|.[^o].{4}|.{2}[^r].{3}|.{3}[^l].{2}|.{4}[^d].|.{5}[^.])|.{0,5})$
([^w].{5}|.[^o].{4}|.{2}[^r].{3}|.{3}[^l].{2}|.{4}[^d].|.{5}[^.]$|^.{0,5})$
foo
) (tidak ada POSIX compliant patern, maaf):^(?!.*foo)
^(?!.*foo).*$
|
simbol):^[^|]*$
foo
):^(?!foo$)
^(?!foo$).*$
^(.{0,2}|.{4,}|[^f]..|.[^o].|..[^o])$
cat
):/cat(*SKIP)(*FAIL)|[^c]*(?:c(?!at)[^c]*)*/i
atau/cat(*SKIP)(*FAIL)|(?:(?!cat).)+/is
(cat)|[^c]*(?:c(?!at)[^c]*)*
(atau(?s)(cat)|(?:(?!cat).)*
, atau(cat)|[^c]+(?:c(?!at)[^c]*)*|(?:c(?!at)[^c]*)+[^c]*
) dan kemudian memeriksa dengan bahasa berarti: jika Grup 1 cocok, itu bukan yang kita butuhkan, atau ambil nilai kecocokan jika tidak kosong[^a-z]+
(karakter apa pun selain huruf ASCII huruf kecil)|
:[^|]+
Catatan demo : baris baru
\n
digunakan di dalam kelas karakter yang dinegasikan dalam demo untuk menghindari kecocokan pencocokan dengan baris tetangga. Mereka tidak perlu saat menguji string individu.Catatan jangkar : Dalam banyak bahasa, gunakan
\A
untuk mendefinisikan awal string yang jelas, dan\z
(dalam Python\Z
, dalam JavaScript,$
adalah OK) untuk menentukan bagian paling akhir dari string.Dot note : Dalam banyak rasa (tapi bukan POSIX, TRE, TCL),
.
cocok dengan char apa pun kecuali char baris baru . Pastikan Anda menggunakan pengubah DOTALL yang sesuai (/s
di PCRE / Boost / .NET / Python / Java dan/m
di Ruby).
agar sesuai dengan karakter apa pun termasuk baris baru.Catatan
\n
garis miring terbalik : Dalam bahasa di mana Anda harus mendeklarasikan pola dengan string C yang memungkinkan urutan pelarian (seperti untuk baris baru), Anda perlu menggandakan garis miring terbalik yang keluar dari karakter khusus sehingga mesin dapat memperlakukan mereka sebagai karakter literal (misalnya di Jawa,world\.
akan menjadi dinyatakan sebagai"world\\."
, atau menggunakan kelas karakter:)"world[.]"
. Gunakan literal string mentah (Pythonr'\bworld\b'
), literal string C # verbatim@"world\."
, atau string slashy / regex notasi literal seperti/world\./
.sumber
^(?!foo$)
, mengapa tanda dolar harus berada dalam tanda kurung agar ekspresi tersebut berfungsi? Saya mengharapkan^(?!foo)$
untuk memberikan hasil yang sama, tetapi tidak.$
jangkar berada di dalam lookahead, itu adalah bagian dari kondisi, bagian dari pernyataan lebar nol itu . Jika berada di luar, seperti di^(?!foo)$
, itu akan menjadi bagian dari pola konsumsi yang membutuhkan akhir string tepat setelah awal string, membuat tampilan negatif tidak relevan karena akan selalu kembali benar (tidak ada teks setelah akhir string , apalagifoo
). Jadi,^(?!foo$)
kecocokan mulai dari string yang tidak diikuti denganfoo
yang diikuti dengan akhir string.^(?!foo)$
cocok dengan string kosong.cot
ataulan
, dan menghapus kecocokan, sepertiregex.replace(myString, "^.*?(?:cot|lan)\s*", "")
.Anda dapat menempatkan a
^
di awal set karakter untuk mencocokkan apa pun kecuali karakter tersebut.akan cocok dengan segalanya kecuali
=
sumber
Cocokkan saja
/^index\.php/
lalu tolak apa pun yang cocok dengannya.sumber
str !~ /\Aindex\.php/
.Dengan python:
sumber
Gunakan metode Exec
ATAU PERTANDINGAN LAINNYA
sumber
Bagaimana kalau tidak menggunakan regex:
sumber
grep
pada command-line, misalnya, atau Perl / Python / bahasa lain, atau perintah "Jalankan regex ini untuk setiap baris" dalam editor teks, dll ...)