Hangi regex virgül ',' veya noktalı virgül ';' hariç her karakterle eşleşir?


345

Belirli bir tanımlanmış karakter veya karakter kümesi hariç her karakterle eşleşecek bir normal ifade tanımlamak mümkün müdür?

Temel olarak, bir dizeyi virgül (,) veya noktalı virgül (;) ile bölmek istedim. Bu yüzden, virgül veya noktalı virgülle karşılaşana kadar her şeye uyan bir regex ile yapmayı düşünüyordum.

Yanıtlar:


474
[^,;]+         

Kullandığınız normal ifade uygulamasını belirtmediniz. Çoğu, Splitsınırlayıcıları alan ve onlar tarafından bölünen bir yönteme sahiptir. Bunu "normal" ( ^sınıfsız) karakter sınıfıyla kullanmak isteyebilirsiniz :

[,;]+

10
Ve soru, bitişik ayırıcılara izin verilip verilmediğini belirtmez, bu nedenle sondaki '+' biraz şüpheli.
Jonathan Leffler

Yalnızca noktalı virgül için hata alıyorum - sonlandırılmamış normal ifade dosyanın sonu ile buluşuyor
Jaswinder

Sonunda noktalı virgül ve virgül önlemek için benzer bir gereksinim vardı Ben çok denedim ama aşağıda hiçbir başarı const regexDomain = / ^ kullanıyorum Regex olduğunu (?: [A-Za-z0-9] (?: [A-Za-0-9 -] {0,61} [A-Za-0-9]) \) + [A-Za-0-9] [A-Za-0-9 -]?. { 0,61} [A-Za-0-9] / g; Kullanırsam doğrular ve; arasında ancak sonunda vliadate başarısız.
Harry

87

Karakter sınıflarını kullanın. Düzeltme işareti ile başlayan bir karakter sınıfı, sınıfta olmayan her şeyle eşleşir.

[^,;]


Sonunda noktalı virgül ve virgül önlemek için benzer bir gereksinim vardı Ben çok denedim ama aşağıda hiçbir başarı const regexDomain = / ^ kullanıyorum Regex olduğunu (?: [A-Za-z0-9] (?: [A-Za-0-9 -] {0,61} [A-Za-0-9]) \) + [A-Za-0-9] [A-Za-0-9 -]?. { 0,61} [A-Za-0-9] / g; Kullanırsam doğrular ve; arasında ancak sonunda vliadate başarısız.
Harry


2

Bunu kullan:

([^,;]*[,;])*

5
Bu, alan ayırıcısı yerine alan ayırıcısı olarak virgül veya noktalı virgül gerektirir. Fark, bir 'satır'ın (veya taranan başka bir kayıt yapısının) sonunda önemlidir; tipik olarak, son alandan sonra virgül veya noktalı virgül üzerinde ısrar etmek istemezsiniz. Normal ifade motorunuz yeterince güçlü ise, ' (?:([^,;]*)(?:[^,;]|$))' (yakalamayan parantez içeren PCRE) kullanabilirsiniz. Alandan sonra veya kayıt sonunda virgül veya noktalı virgülün alternatifleri işleri daha iyi yapar. Boş alanlara izin verilip verilmeyeceğini de düşünün.
Jonathan Leffler

1
Son olarak, yakalamalarla gerçekte neyin geri döndüğünden endişe etmelisiniz - ayırıcıların gerçekten dahil edilmesini istediniz mi ve bir satırda 10 alan varsa, kaç tanesi yakalama gösterimi tarafından döndürülür.
Jonathan Leffler

1
Tüm bunlar hakkında haklısın, ancak cevabımda bu şeyi konser vermememin nedeni, sorgulayıcının RegEx'in hangi dilini / kütüphanesini istediğini bilmemem. "GREP" kullanıyor olabilir. Her neyse, onun için bir şeyler temizlemek için bu yorumları eklediğiniz için teşekkür ederim. : D
NawaMan
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.