Harfler, sayılar ve - _ için normal ifade


110

Bir değerin aşağıdaki kombinasyonlardan herhangi biri olup olmadığını kontrol etmekte sorun yaşıyorum

  • harfler (büyük veya küçük harf)
  • sayılar (0-9)
  • vurgulamak (_)
  • tire (-)
  • nokta (.)
  • boşluksuz! veya diğer karakterler

birkaç örnek:

  • Tamam: "screen123.css"
  • Tamam: "screen-new-file.css"
  • Tamam: "screen_new.js"
  • TAMAM DEĞİL: "yeni dosya.css'yi görüntüle"

Sanırım bunun için bir regex'e ihtiyacım var, çünkü bir give stringinde yukarıda belirtilenlerden başka karakterler varken bir hata vermem gerekiyor.


^ [\ w .-] * $ -> Bu, tüm dosya adını alacaktır.
Badri Gs

Yanıtlar:


222

İstediğiniz kalıp şuna benzer ( rubular.com'a bakın ):

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

Açıklama:

  • ^ hat çapasının başlangıcıdır
  • $ hattın sonu çapası
  • [...] bir karakter sınıfı tanımıdır
  • * "sıfır veya daha fazla" tekrar

Düz çizgi -karakter sınıfı tanımındaki son karakterdir, aksi takdirde farklı bir anlamı vardır (yani aralık). .Ayrıca farklı bir anlam dışında karakter sınıfı tanımları vardır, ancak içeride, sadece bir edebi var.

Referanslar


PHP'de

İşte bu kalıbı nasıl kullanabileceğinizi gösteren bir pasaj:

<?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";
  };
}

?>

Yukarıdaki baskılar ( ideone.com'da görüldüğü gibi ):

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!!!

\wBunun yerine deseninin biraz farklı olduğuna dikkat edin . Bu, "kelime karakteri" için karakter sınıfıdır.

API referansları


Özelliklerle ilgili not

Bu sizin spesifikasyonunuza uygun görünüyor, ancak bunun ....., vb. Gibi şeylerle eşleşeceğini unutmayın , bunlar sizin istediğiniz gibi olabilir veya olmayabilir. Hangi kalıbı eşleştirmek istediğinizi daha belirgin hale getirebilirseniz, normal ifade biraz daha karmaşık olacaktır.

Yukarıdaki normal ifade, boş dizeyle de eşleşir. En az bir karaktere ihtiyacınız varsa, tekrarlama için (sıfır veya +daha fazla) yerine (bir veya daha fazla) kullanın *.

Her durumda, spesifikasyonunuzu daha fazla netleştirebilirsiniz (normal ifade sorusu sorduğunuzda her zaman yardımcı olur), ancak umarım yukarıdaki bilgiler göz önüne alındığında kalıbı nasıl yazacağınızı da öğrenebilirsiniz.


İstediğinizden daha fazlası olabilecek farklı bir özellik için ideone.com/5DMCa'ya da bakın . Spesifikasyonu benimle geliştirmek istiyorsanız, benimle rubular üzerinde ileri geri gidin.
poligenel yağlayıcılar

Tornado kullanıyorum ve html adlarını yakalamam gerekiyor, bu yüzden bunu cevabınıza göre kullandım; ^/([a-zA-Z0-9._-]*\.html)$
NuclearPeon

Başka bir kural eklerdim: son karakter alfanümerik olmalıdır. Regex güncellendi:/[a-zA-Z0-9]+(\.[a-zA-Z0-9]+){2,}[a-zA-Z0-9^]$/
Consta Gorgan

Go (golang) kullanıcıları, uyarılar, buradaki desen falseboş ham dize değişmezleri ile sonuçlanacaktır . Oyun alanı . Aşağıdaki @ nonopolarity çözümünü kullanın .
BentCoder

16

kullanabilirsiniz

^[\w\d_.-]+$

+En az 1 karaktere sahiptir emin olmaktır. Başlangıcı ve sonu belirtmek için ^ve $işaretine ihtiyacınız var , aksi takdirde dizenin ortasında bir eşleşme varsa, örneğin @@@@xyz%%%%o zaman hala bir eşleşmedir.


3
-Bir aralık tanımlamaktan kaçınmak için ilkini sete koyun . Ve \wkapaklar alphanumerics ve alt çizgi. Yani ihtiyacın var [\w.-]+.
Richard

Teşekkürler, Bu benim için iyi çalışıyor: ^ [\ w \ d _.-] + \. (Csv | CSV) $
Dharam Mali

Bu aynı zamanda Go'nun (golang) boş ham dize değişmezleriyle de uyumludur, oysa kabul edilen yanıt Go kullanıcıları bu çözüme bağlı kalmaz. Oyun Alanı
BentCoder

9

Aslında kalıbınızı örtmek için, yani kurallarınıza göre geçerli dosya isimleri, biraz daha fazlasına ihtiyacınız olduğunu düşünüyorum. Bunun yasal dosya adlarıyla sistem açısından eşleşmediğini unutmayın . Bu, sisteme bağlı ve kabul ettiği şeyde daha liberal olacaktır. Bunun, kabul edilebilir kalıplarınızla eşleşmesi amaçlanmıştır.

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

Açıklama:

  • ^Bir dizenin başlangıcını eşleştirin. Bu (artı bitiş eşleşmesi), dizeyi yalnızca ifadeyle eşleşen bir alt dize içermeye değil, tam ifadeye uymaya zorlar.
  • ([a-zA-Z0-9]+[_-])*Bir veya daha fazla harf veya sayının sıfır veya daha fazla tekrarlanması ve ardından alt çizgi veya kısa çizgi gelir. Bu, tire veya alt çizgi içeren tüm adların aralarında harf veya rakam olmasına neden olur.
  • [a-zA-Z0-9]+Bir veya daha fazla harf veya rakam. Bu, alt çizgi veya tire içermeyen tüm adları kapsar.
  • \.Gerçek bir nokta (nokta). Dosya adını bir uzantıya sahip olmaya zorlar ve kalıbın geri kalanından hariç tutarak, yalnızca ad ve uzantı arasında dönemin kullanılmasına izin verir. Birden fazla uzantı istiyorsanız, kısa çizgi / alt çizgi ile aynı tekniği kullanarak, sadece sonunda.
  • [a-zA-Z0-9]+Bir veya daha fazla harf veya rakam. Uzantı en az bir karakter uzunluğunda olmalı ve yalnızca harf ve rakam içermelidir. Bu tipiktir, ancak alt çizgilere izin vermek isterseniz, bu da ele alınabilir. Daha uygun olsaydı {2,3}, bir veya daha fazla +eşleştirici yerine bir uzunluk aralığı da sağlayabilirsiniz .
  • $Dizenin sonunu eşleştirin. Başlangıç ​​karakterine bakın.

7

Aradığınız model bu

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

Bu ne anlama geliyor:

  • ^ Dizenin başlangıcı
  • [...] İçindeki karakterleri eşleştir
  • \w Herhangi bir kelime karakteri yani 0-9 a-z A-Z
  • -_.Maç -ve _ve.
  • * Sıfır veya daha fazla desen veya sınırsız
  • $ Dizenin sonu

Karakter miktarını sınırlamak istiyorsanız:

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

{0,5}araçlar 0-5karakterler


var a = / ^ \ w * $ / g a.test ("46545") ve sonuç yanlıştı
Dipak

1
Bildirim \wiçerir_
Galaxy

4

Bunun gibi bir şey çalışmalı

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

Bu "geçerli değil" yankılanacak


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.