Pertanyaan Ekspresi reguler menggunakan tampilan negatif tidak berfungsi di Notepad ++


Saya memiliki file sumber dengan ratusan kejadian string flecha.jpg dan flecha1.jpg, tapi aku harus menemukan kejadian yang lain .jpg gambar (yaitu casa.jpg, moto.jpg, terserah)

Saya telah mencoba menggunakan ekspresi reguler dengan tampilan negatif, seperti ini:

(?<!flecha|flecha1).jpg

tetapi itu tidak berhasil! Notepad ++ hanya mengatakan bahwa itu adalah ekspresi reguler yang tidak valid.

Saya telah mencoba regex di tempat lain dan berhasil, di sini adalah contoh jadi saya kira itu adalah masalah dengan penanganan NPP dari regexes atau dengan sintaks lookbehinds / lookaheads.

Jadi bagaimana saya bisa mencapai hasil regex yang sama dalam PLTN?

Jika bermanfaat, saya menggunakan Notepad ++ versi 6.3 Unicode

Sebagai tambahan, jika Anda begitu baik, apa yang akan menjadi sintaks untuk mencapai hal yang sama tetapi dengan nomor opsional (dalam hal ini hanya '1') sebagai akhiran string saya? (Bahkan jika itu tidak bekerja di PLTN, hanya untuk tahu) ...

Saya mencoba (?<!flecha[1]?).jpg tetapi itu tidak berhasil. Ini harus bekerja sama dengan regex lainnya, lihat di sini (RegExr)


13
2018-06-24 23:17


asal


Jawaban:


Notepad ++ tampaknya tidak menerapkan look-behinds variabel panjang (ini terjadi dengan beberapa alat). Sebuah solusi adalah dengan menggunakan lebih dari satu tampilan panjang-tetap:

(?<!flecha)(?<!flecha1)\.jpg

Seperti yang bisa Anda periksa, pertandingannya sama. Tetapi ini bekerja dengan npp.

Perhatikan saya melarikan diri ., karena Anda mencoba mencocokkan ekstensi, yang Anda inginkan adalah literal .. Cara yang Anda miliki, itu adalah wildcard - bisa menjadi karakter apa pun.

Tentang pertanyaan tambahan, sayangnya, karena kita tidak dapat melihat panjang-belakang variabel, tidak mungkin memiliki sufiks opsional (angka) tanpa banyak melihat-balik.


13
2018-06-25 01:08



Apakah Anda sadar bahwa Anda hanya cocok (dalam arti mengkonsumsi) ekstensi (.jpg)? Saya akan berpikir Anda ingin mencocokkan seluruh nama file, bukan? Dan itu jauh lebih mudah dilakukan dengan lookahead:

\b(?!flecha1?\b)\w+\.jpg

Pertama \b jangkar pertandingan ke awal nama (dengan asumsi itu benar-benar nama file yang kita cari). Kemudian (?!flecha1?\b) menegaskan bahwa nama itu tidak flecha atau flecha1. Setelah selesai, \w+ pergi ke depan dan mengkonsumsi nama. Kemudian \.jpg mengambil ekstensi untuk menyelesaikan pertandingan.


2
2018-06-25 04:53



Memecahkan masalah keterbatasan variable-length-negative-lookbehind di Notepad ++

Diberikan di sini adalah beberapa strategi untuk mengatasi keterbatasan ini di Notepad ++ (atau mesin regex dengan batasan yang sama)

Mendefinisikan masalah

Notepad ++ tidak mendukung penggunaan pernyataan negatif variabel-panjang, dan itu akan menyenangkan untuk memiliki beberapa solusi. Mari kita pertimbangkan contoh dalam pertanyaan asli, tetapi menganggap kita ingin menghindari kemunculan file bernama flecha dengan apa saja jumlah digit setelah flecha, dan dengan karakter apa pun sebelumnya flecha. Dalam hal ini, regex yang menggunakan tampilan negatif variabel-panjang akan terlihat seperti (?<!flecha[0-9]*)\.jpg.

String kita tidak ingin cocok dalam contoh ini

  • flecha.jpg
  • flecha1.jpg
  • flecha00501275696.jpg
  • aflecha.jpg
  • img_flecha9.jpg
  • abcflecha556677.jpg

Strategi

  1. Memasukkan Spidol Sementara

    Mulailah dengan melakukan pencarian dan ganti pada contoh yang ingin Anda hindari bekerja - dalam kasus kami, contoh flecha[0-9]*\.jpg. Masukkan penanda khusus untuk membentuk pola yang tidak muncul di tempat lain. Untuk contoh ini, kita akan memasukkan ekstra . sebelum .jpg, berasumsi bahwa ..jpg tidak muncul di tempat lain. Jadi kita lakukan:

    Menemukan: (flecha[0-9]*)(\.jpg)

    Ubah dengan: $1.$2

    Sekarang Anda dapat mencari dokumen Anda untuk semua yang lain .jpg nama file dengan regex sederhana seperti \w+\.jpg atau (?<!\.)\.jpg dan lakukan apa yang Anda inginkan dengan mereka. Setelah selesai, lakukan operasi pencarian dan ganti akhir tempat Anda mengganti semua instance ..jpg dengan .jpg, untuk menghapus penanda sementara.

  2. Menggunakan pernyataan lookahead negatif

    Pernyataan lookahead negatif dapat digunakan untuk memastikan bahwa Anda tidak cocok dengan nama file yang tidak diinginkan:

    (?<!\S)(?!\S*flecha\d*\.jpg)\S+\.jpg

    Memecahnya:

    • (?<!\S) memastikan bahwa pertandingan Anda dimulai pada awal nama file, dan bukan di tengah, dengan menyatakan bahwa kecocokan Anda tidak didahului oleh karakter non-spasi.
    • (?!\S*flecha\d*\.jpg) memastikan bahwa apa pun yang dicocokkan tidak mengandung pola yang ingin kita hindari
    • \S+\.jpg adalah apa yang sebenarnya cocok - string karakter non-whitespace diikuti .jpg.
  3. Menggunakan beberapa lookbehinds negatif dengan panjang tetap

    Ini adalah solusi cepat (tetapi tidak begitu elegan) untuk situasi di mana pola yang tidak Anda inginkan memiliki sejumlah kecil kemungkinan panjang.

    Misalnya, jika kita tahu itu flecha hanya diikuti hingga tiga digit, regex kami dapat berupa:

    (?<!flecha)(?<!flecha[0-9])(?<!flecha[0-9][0-9])(?<!flecha[0-9][0-9][0-9])\.jpg


2
2018-02-11 02:39