Ekspresi reguler untuk huruf, angka dan - _


106

Saya mengalami masalah saat memeriksa di PHP jika nilainya adalah salah satu dari kombinasi berikut

  • huruf (huruf besar atau kecil)
  • angka (0-9)
  • garis bawah (_)
  • berlari (-)
  • titik (.)
  • tidak ada ruang! atau karakter lain

beberapa contoh:

  • Oke: "screen123.css"
  • Oke: "screen-new-file.css"
  • Oke: "screen_new.js"
  • TIDAK OK: "saring file baru.css"

Saya kira saya memerlukan regex untuk ini, karena saya perlu melempar kesalahan ketika string give memiliki karakter lain di dalamnya daripada yang disebutkan di atas.


^ [\ w .-] * $ -> Ini akan mendapatkan semua nama file.
Badri Gs

Jawaban:


216

Pola yang Anda inginkan adalah sesuatu seperti ( lihat di rubular.com ):

^[a-zA-Z0-9_.-]*$

Penjelasan:

  • ^ adalah awal dari jangkar baris
  • $ adalah akhir dari jangkar baris
  • [...] adalah definisi kelas karakter
  • * adalah pengulangan "nol-atau-lebih"

Perhatikan bahwa tanda hubung literal -adalah karakter terakhir dalam definisi kelas karakter, jika tidak maka memiliki arti yang berbeda (yaitu rentang). Itu .juga memiliki arti yang berbeda di luar definisi kelas karakter, tetapi di dalamnya, itu hanya literal.

Referensi


Di PHP

Berikut cuplikan untuk menunjukkan bagaimana Anda dapat menggunakan pola ini:

<?php

$arr = array(
  'screen123.css',
  'screen-new-file.css',
  'screen_new.js',
  'screen new file.css'
);

foreach ($arr as $s) {
  if (preg_match('/^[\w.-]*$/', $s)) {
    print "$s is a match\n";
  } else {
    print "$s is NO match!!!\n";
  };
}

?>

Cetakan di atas ( seperti yang terlihat di ideone.com ):

screen123.css is a match
screen-new-file.css is a match
screen_new.js is a match
screen new file.css is NO match!!!

Perhatikan bahwa polanya sedikit berbeda, gunakan \wsebagai gantinya. Ini adalah kelas karakter untuk "karakter kata".

Referensi API


Catatan tentang spesifikasi

Ini tampaknya mengikuti spesifikasi Anda, tetapi perhatikan bahwa ini akan cocok dengan hal-hal seperti ....., dll, yang mungkin atau mungkin tidak sesuai dengan keinginan Anda. Jika Anda bisa lebih spesifik pola apa yang ingin Anda cocokkan, ekspresi reguler akan sedikit lebih rumit.

Regex di atas juga cocok dengan string kosong. Jika Anda membutuhkan setidaknya satu karakter, gunakan +(satu-atau-lebih) daripada *(nol-atau-lebih) untuk pengulangan.

Bagaimanapun, Anda dapat lebih memperjelas spesifikasi Anda (selalu membantu saat mengajukan pertanyaan regex), tetapi mudah-mudahan Anda juga dapat mempelajari cara menulis pola sendiri dengan informasi di atas.


Lihat juga ideone.com/5DMCa untuk spesifikasi berbeda yang mungkin lebih dari yang Anda inginkan. Bolak-balik dengan saya di rubular jika Anda ingin mengembangkan spesifikasi dengan saya.
poligenelubricants

Saya menggunakan Tornado dan perlu menangkap nama html, jadi saya menggunakan ini berdasarkan jawaban Anda; ^/([a-zA-Z0-9._-]*\.html)$
NuclearPeon

Saya akan menambahkan aturan lain yaitu: karakter terakhir harus berupa alfanumerik. Regex Diperbarui:/[a-zA-Z0-9]+(\.[a-zA-Z0-9]+){2,}[a-zA-Z0-9^]$/
Consta Gorgan

Pengguna Go (golang), kepala ke atas, pola di sini akan menghasilkan falseliteral string mentah yang kosong. Taman bermain . Gunakan solusi @ nonopolarity di bawah ini .
BentCoder

16

kamu bisa memakai

^[\w\d_.-]+$

yang +adalah untuk memastikan ia memiliki setidaknya 1 karakter. Perlu ^dan $untuk menunjukkan awal dan akhir, sebaliknya jika string memiliki kecocokan di tengah, @@@@xyz%%%%maka string tersebut masih cocok.


3
Letakkan yang -pertama dalam set, untuk menghindari menentukan rentang. Dan \wmencakup alfanumerik dan garis bawah. Jadi yang Anda butuhkan [\w.-]+.
Richard

Terima kasih, Ini berfungsi dengan baik untuk saya: ^ [\ w \ d _.-] + \. (Csv | CSV) $
Dharam Mali

Ini juga sesuai dengan literal string mentah kosong Go (golang) sedangkan jawaban yang diterima tidak sehingga pengguna Go tetap menggunakan solusi ini. Playground
BentCoder

8

Untuk benar-benar menutupi pola Anda, yaitu, nama file yang valid sesuai dengan aturan Anda, saya rasa Anda membutuhkan lebih banyak. Perhatikan bahwa ini tidak cocok dengan nama file legal dari perspektif sistem . Itu akan bergantung pada sistem dan lebih liberal dalam apa yang diterimanya. Ini dimaksudkan agar sesuai dengan pola Anda yang dapat diterima.

^([a-zA-Z0-9]+[_-])*[a-zA-Z0-9]+\.[a-zA-Z0-9]+$

Penjelasan:

  • ^Cocokkan awal string. Ini (ditambah pencocokan akhir) memaksa string untuk menyesuaikan dengan ekspresi yang tepat, tidak hanya berisi substring yang cocok dengan ekspresi.
  • ([a-zA-Z0-9]+[_-])*Nol atau lebih kemunculan satu atau beberapa huruf atau angka diikuti dengan garis bawah atau tanda hubung. Ini menyebabkan semua nama yang mengandung tanda hubung atau garis bawah memiliki huruf atau angka di antara mereka.
  • [a-zA-Z0-9]+Satu atau lebih huruf atau angka. Ini mencakup semua nama yang tidak mengandung garis bawah atau setrip.
  • \.Titik literal (titik). Memaksa nama file untuk memiliki ekstensi dan, dengan pengecualian dari pola lainnya, hanya izinkan titik yang akan digunakan antara nama dan ekstensi. Jika Anda menginginkan lebih dari satu ekstensi yang dapat ditangani juga menggunakan teknik yang sama seperti untuk tanda hubung / garis bawah, tepat di bagian akhir.
  • [a-zA-Z0-9]+Satu atau lebih huruf atau angka. Ekstensi minimal harus satu karakter dan hanya berisi huruf dan angka. Ini tipikal, tetapi jika Anda ingin mengizinkan garis bawah, itu bisa diatasi juga. Anda juga dapat memberikan rentang panjang {2,3}sebagai ganti satu atau lebih +matcher, jika itu lebih sesuai.
  • $Cocokkan ujung string. Lihat karakter awal.

7

Ini adalah pola yang Anda cari

/^[\w-_.]*$/

Artinya:

  • ^ Awal dari string
  • [...] Cocokkan karakter di dalamnya
  • \w Karakter kata apapun gitu 0-9 a-z A-Z
  • -_.Cocok -dan _dan.
  • * Nol atau lebih dari pola atau tidak terbatas
  • $ Akhir string

Jika Anda ingin membatasi jumlah karakter:

/^[\w-_.]{0,5}$/

{0,5}Berarti 0-5karakter


var a = / ^ \ w * $ / g a.test ("46545") dan hasilnya salah
Dipak

1
Perhatikan itu \wtermasuk_
Galaxy

4

Sesuatu seperti ini seharusnya berhasil

$code = "screen new file.css";
if (!preg_match("/^[-_a-zA-Z0-9.]+$/", $code))
{
    echo "not valid";
}

Ini akan bergema "tidak valid"


2

[A-Za-z0-9_.-]*

Ini juga akan cocok untuk string kosong, jika Anda tidak ingin menukar yang terakhir *dengan+

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.