String pencocokan RegExp tidak dimulai dengan my

93

Untuk PMD, saya ingin memiliki aturan yang memperingatkan saya tentang variabel jelek yang dimulai dengan my.
Ini berarti saya harus menerima semua variabel yang TIDAK dimulai my.

Jadi, saya membutuhkan RegEx (re) yang berperilaku sebagai berikut:

re.match('myVar')       == false
re.match('manager')     == true
re.match('thisIsMyVar') == true
re.match('myOtherVar')  == false
re.match('stuff')       == true

Saya sudah mencoba yang berbeda tetapi belum berhasil.

Dominik Sandjaja
sumber
1
Saya pikir itu seharusnya pandangan negatif ke belakang (bukan pandangan negatif ke depan).
Indrit

Jawaban:

43

Anda bisa menggunakan pernyataan lookahead seperti yang disarankan orang lain. Atau, jika Anda hanya ingin menggunakan sintaks ekspresi reguler dasar:

^(.?$|[^m].+|m[^y].*)

Ini cocok dengan string yang panjangnya nol atau satu karakter ( ^.?$) dan karenanya tidak bisa my. Atau string dengan dua atau lebih karakter di mana ketika karakter pertama bukan mkarakter lagi dapat mengikuti ( ^[^m].+); atau jika karakter pertama adalah a mmaka tidak boleh diikuti oleh a y( ^m[^y]).

Gumbo
sumber
Ini yang bisa kita gunakan sekarang. Sepertinya ada masalah dengan regexp yang diperpanjang, tapi yang ini berfungsi dengan baik untuk saat ini.
Dominik Sandjaja
169
^(?!my)\w+$

harus bekerja.

Pertama, memastikan bahwa tidak mungkin untuk mencocokkan mydi awal string, lalu mencocokkan karakter alfanumerik hingga akhir string. Spasi kosong di mana saja dalam string akan menyebabkan regex gagal. Bergantung pada masukan Anda, Anda mungkin ingin menghapus spasi kosong di depan dan belakang string sebelum meneruskannya ke regex, atau gunakan tambahkan pencocok spasi kosong opsional ke seperti regex ^\s*(?!my)(\w+)\s*$. Dalam kasus ini, referensi latar 1 akan berisi nama variabel.

Dan jika Anda perlu memastikan bahwa nama variabel Anda dimulai dengan sekelompok karakter tertentu, katakanlah [A-Za-z_], gunakan

^(?!my)[A-Za-z_]\w*$

Perhatikan perubahan dari +menjadi *.

Tim Pietzcker
sumber
63
/^(?!my).*/

(?!expression)adalah pandangan negatif; itu cocok dengan posisi di mana expression tidak cocok mulai dari posisi itu.

Amber
sumber
7

Bukankah akan jauh lebih mudah dibaca untuk melakukan pencocokan positif dan menolak string tersebut - daripada mencocokkan negatif untuk menemukan string untuk diterima?

/^my/
Victor Bruno
sumber
4
Itu akan lebih mudah TETAPI itu diperlukan untuk aturan yang memeriksa kode saat melakukan ke repositori, maka logika tidak bisa "dikembalikan".
Dominik Sandjaja