Sözcükler arasındaki boşluklara izin vermek için düzenli ifade


191

Sembolleri engelleyen ve sadece harf ve sayılara izin veren düzenli bir ifade istiyorum. Aşağıdaki normal ifade harika çalışıyor, ancak kelimeler arasındaki boşluklara izin vermiyor.

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

Örneğin, bu normal ifadeyi kullanırken "HelloWorld" iyidir, ancak "Hello World" eşleşmez.

Alanlara izin vermek için nasıl değiştirebilirim?

Yanıtlar:


372

tl; Dr.

Karakter sınıfınıza bir boşluk ekleyin .

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

 


Şimdi, katı olmak istiyorsanız ...

Yukarıdakiler tam olarak doğru değil. Sıfır veya daha fazla* anlamına gelmesi nedeniyle, genellikle eşleşmek istemediği aşağıdaki durumların tümü ile eşleşir:

  • Boş bir dize "".
  • "", Tamamen boşluklardan oluşan bir dize.
  • Boşlukları olan ve / veya izleri olan "Hello World" dizesi
  • Sözcükler arasında birden çok boşluk içeren bir dize, "Merhaba Dünya".

Başlangıçta OP bu kadar temel bir soru sorduğu için, bu ayrıntıların girmeye değer olduğunu düşünmüyordum. Şimdi soru biraz popülerlik kazandığına göre, şunu söylemek istiyorum ...

... @ stema'nın cevabını kullan .

Hangi, benim lezzet (kullanmadan \w) anlamına gelir:

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

(Lütfen ne olursa olsun @stema'yı oylayın.)

Bu (ve @ stema's) yanıtı hakkında dikkat edilmesi gereken bazı şeyler:

  • Sözcükler arasında birden çok boşluğa izin vermek istiyorsanız (örneğin, yanlışlıkla çift boşluklara izin vermek istiyorsanız veya PDF'den kopyalanmış bir metinle çalışıyorsanız), +boşluktan sonra bir boşluk ekleyin :

    ^\w+( +\w+)*$
  • Sekmelere ve yeni satırlara (boşluk karakterleri) izin vermek istiyorsanız, alanı bir ile değiştirin \s+:

    ^\w+(\s+\w+)*$

    Burada +varsayılan olarak öneririm, çünkü örneğin, Windows çizgi satırları sırayla iki boşluk karakterden oluşur \r\n, bu nedenle+ her ikisini de yakalamanız .

Hala çalışmıyor?

Kullandığınız normal ifadelerin lehçesini kontrol edin. * Java gibi dillerde siz, ters eğik çizgi kaçış gerekecek ie \\w ve \\s. Yaşlı ya da daha fazla temel dil ve yardımcı programlar, gibi sed, \wve \stanımlanmamış, bu yüzden karakter sınıfları, onları yazmak örn [a-zA-Z0-9_] ve [\f\n\p\r\t]sırasıyla.

 


* Bu sorunun etiketlendiğini biliyorum, ancak 25.000'den fazla görüşe dayanarak, sadece bu soruya katılanlar değil. Şu anda arama ifadesi, normal ifade alanı kelimesi için Google'da ilk hit .


3
boş dize sağlar
Neha Choudhary

1
Vay, çok basit! Teşekkürler. Bir site veya regex ifadeleri oluşturmak için kullanabileceğiniz bir şey yok, noobs için demek istediğim ...
Pierre

1
@Pierre - İnsan talimatlarını almak ve bunları açık kurallara dönüştürmek oldukça zordur. (İnsan dili akıcıdır ve belirsizlikler ile doludur ve beynimiz bir şeyleri çözmek ve boşlukları doldurmak için gerekli olan işlerin çoğunu yapar. ) Regex'inizi görsel olarak temsil eden debuggex.com gibi araçlar var , ancak olduğu gibi çekici olmak, yeni başlayanlar için çok yararlı olmayabilir. Bununla birlikte, temel bilgileri indirebilmeniz için etkileşimli bir eğitici öneririm .
Andrew Cheong

1
Evet, sadece boşluklar varsa normal ifadeniz de eşleşecektir. Cevabım Neha choudary'nin yorumuna oldu.
Rajshekar Reddy

1
@Pierre Üç yıl sonra - Bugün bu soruya rastladım, yorumunuzu gördüm; Normal ifadeleri test etmek için regex hero ( regexhero.net ) kullanıyorum . Çevrimiçi sürümün Internet Explorer'da yalnızca Silverlight ile çalıştığını düşünüyorum, ancak hiçbir şeyden daha iyi değil.
Michael Armes

121

Bir olasılık, sadece acheong87'nin önerdiği gibi, karakter sınıfınıza boşluk eklemek olacaktır, bu sizin deseniniz üzerinde ne kadar katı olduğunuza bağlıdır, çünkü bu da 5 boşlukla başlayan bir dizeye veya yalnızca boşluklardan oluşan dizelere izin verir.

Diğer olasılık bir desen tanımlamaktır:

Ben kullanacağım \wen regex tatlar aynıdır [a-zA-Z0-9_](bazılarında Unicode tabanlı)

^\w+( \w+)*$

Bu, en az bir kelimeden oluşan bir diziye izin verir ve kelimeler boşluklara bölünür.

^ Dizenin başlangıcını eşleştir

\w+ En az bir kelime karakteri içeren bir diziyi eşleştirin

( \w+)*0 veya daha fazla kez tekrarlanan bir gruptur. Grupta bir boşluk ve ardından en az bir kelime karakterden oluşan bir dizi bekleniyor

$ dizenin sonuyla eşleşir


Bu: regex101.com/#javascript , analiz etmek istediğiniz normal ifade modeli için de iyi bir açıklama sağlar.
Dark Star1

Nice Regex, çok daha basit [0-9a-z] vb.
George


12

Şunu deneyin:

^(\w+ ?)*$

Açıklama:

\w             - alias for [a-zA-Z_0-9]
"whitespace"?  - allow whitespace after word, set is as optional

2
Bu geri izleme cehennemine yol açacak.
nhahtdh

1
Örneğin, eşleşmeyen bir dize verildiğinde ggggggggggggggggggggggggggggggggggggg;, normal ifadenizin aşırı geri izleme nedeniyle sonuca ulaşması çok uzun zaman alacaktır.
nhahtdh

Tamam, ne öneriyorsun?
hsz

7

Sanırım liderlik / takip alanı istemiyorsun. Bu, normal ifadeyi "ilk karakter", "ortadaki şeyler" ve "son karakter" e bölmeniz gerektiği anlamına gelir:

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

veya perl benzeri bir sözdizimi kullanıyorsanız:

^\w[\w ]*\w$

Ayrıca: Regex'inizi boş Dizelere de izin verdiğini kasten ifade ettiyseniz, her şeyi isteğe bağlı yapmanız gerekir:

^(\w[\w ]*\w)?$

Yalnızca tek boşluk karakterlerine izin vermek istiyorsanız, biraz farklı görünüyor:

^((\w+ )*\w+)?$

Bu, 0..n kelimeden sonra tek bir boşluk ve boşluksuz bir sözcükle eşleşir. Boş dizelere izin vermek için her şeyi isteğe bağlı yapar.


Boşluk ve \seşdeğer değildir. \sboşluktan daha fazlası ile eşleşir.
nhahtdh

@nhahtdh: Yorum için teşekkürler. Genelde boşlukları eşleştirmeye çok alışkınım sanırım .. Cevap sabit.
creinig

İlk ifadede kapama parantezi eksik olabilir mi? Denemediğimden emin değilim.
ssinfod

@ ssinfod: İyi yakalama. Aslında açılış parantezi bu örnekte gereksizdir. Teşekkürler.
creinig

4

Bu düzenli ifade

^\w+(\s\w+)*$

yalnızca kelimeler arasında tek bir boşluğa izin verir ve öndeki veya sondaki boşluklar olmaz.

Düzenli ifadenin açıklaması aşağıdadır:

  1. ^ Dizenin başında onaylama konumu
  2. \w+ Herhangi bir kelime karakterini eşleştir [a-zA-Z0-9_]
    1. Nicelik belirteci: +Bir ve sınırsız kez, mümkün olduğunca çok kez, gerektiği kadar geri vermek [açgözlü]
  3. 1. Çekim grubu (\s\w+)*
    1. Nicelik belirteci: *Sıfır ve sınırsız zamanlar arasında, mümkün olduğunca çok kez, gerektiği kadar geri verme [açgözlü]
    2. \s Herhangi bir boşluk karakteriyle eşleştirin [\r\n\t\f ]
    3. \w+ Herhangi bir kelime karakterini eşleştir [a-zA-Z0-9_]
      1. Nicelik belirteci: +Bir ve sınırsız kez, mümkün olduğunca çok kez, gerektiği kadar geri vermek [açgözlü]
  4. $ Dizenin sonundaki onay konumu

2

Bu başlangıçta yer açmaz. Ancak kelimeler arasında boşluk bırakıyor. Ayrıca kelimeler arasında özel karakterlere izin verir. FirstName ve LastName alanları için iyi bir normal ifade.

\w+.*$

Bu cevap yanlış / yanlış. Bu örüntü, bir veya daha fazla alfasayısal, altçizgi, sonra herhangi bir yeni satır olmayan karakterin sıfır veya daha fazlasıyla eşleşir. OP için iyi değil.
mickmackusa

2

Yalnızca alfabe için:

^([a-zA-Z])+(\s)+[a-zA-Z]+$

Alfasayısal değer ve _:

^(\w)+(\s)+\w+$

1
iyi bir örnek değildir, çünkü (bir şey) + (bir şey +) ile aynı değildir. İlk örnekte, yalnızca tek bir karakter $ 1 olarak yakalanacaktır.
Znik

0

Şunu deneyin: (Python sürümü)

"(A-Za-z0-9 ){2, 25}"

üst sınırı veri kümenize göre değiştirme


0

Normal ifade düzeninizin sonuna aşağıdaki gibi bir boşluk eklemeniz yeterlidir:

[a-zA-Z0-9_ ]

-1

Bu varsayılan cevapların birçoğuna iyi bir bakış attı ...

... ve bupkis, Yığın Taşması'nı ve herhangi bir dizeyi boşluk veya sondaki boşluk olmadan ve yalnızca alfa karakter sözcükleri arasında yalnızca tek bir boşlukla eşleşen bir normal ifade için inceledikten sonra .

^[a-zA-Z]+[(?<=\d\s]([a-zA-Z]+\s)*[a-zA-Z]+$

Böylece alfanümerik olarak kolayca değiştirilebilir:

^[a-zA-Z0-9]+[(?<=\d\s]([a-zA-Z0-9]+\s)*[a-zA-Z0-9]+$

(Bu tek sözcüklerle eşleşmez, ancak ^[a-zA-Z0-9]+$ek olarak tek kelimeleri yakalamanız gerekiyorsa, basit / basit bir anahtar / if-else kullanın.)

keyfini çıkarın: D


3
[(?<=\d\s]eşleşen bir karakter: (, ?, <, =, bir rakamla veya bir boşluk karakteri ve bu ne anlama geldiğini olamaz. Eğer bir gözetleme olması gerekiyorsa, öyle olmalı (?<=\d\s), ama orada bir anlam ifade etmiyor; normal ifade asla eşleşmez.
Alan Moore

Upvoters için: Lütfen yanlış çözümler upvated etmeyin. Diğer kullanıcıları karıştırırlar ve regex'in yapmadığı şeyleri yapabileceğini inandırırlar.
Wiktor Stribiżew

-1

Bu bir "FullName" için iyi çalışır buluyorum:

([a-z',.-]+( [a-z',.-]+)*){1,70}/

-4

Deneyin .*? beyaz boşluklara izin vermek benim için çalıştı


Çünkü .her şeye uyuyor. Bu, burada çözüm olmayacak gibi görünüyor.
rubik

sıfırdan veya bu diziden önce ve sonra ne olduğuna bağlı olarak herhangi bir karakterle eşleşir. bu mümkün olduğunca az eşleşir. tek nokta herhangi bir tek karakteri temsil eder.
Znik
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.