Belirli bir karakter dışında herhangi bir beyaz boşluk olmayan karakter nasıl eşleştirilir?


111

Perl'de \Sboşluk olmayan herhangi bir karakterle eşleşir.

Ters eğik çizgi dışında herhangi bir boşluk olmayan karakteri nasıl eşleştirebilirim \?

Yanıtlar:


154

Bir karakter sınıfı kullanabilirsiniz :

/[^\s\\]/

boşluk karakteri veya a olmayan herhangi bir şeyle eşleşir \. İşte başka bir örnek:

[abc]vasıtası "maç a, bya da c"; [^abc]vasıta "dışındaki tüm karakterler maç a, bya c".


Ne zaman ^olumsuzlama, ne zaman satır başlangıcı olarak yorumlanır? Bu bakımdan, bu neden beyaz boşlukların sayısıyla başlayan bir satırla $0~/\s*^\s/
eşleşmiyor

1
Bir karakter sınıfının dışında, "dizenin başlangıcı" dır (veya geçerli eşleme moduna bağlı olarak satır). Bir karakter sınıfının içinde ve yalnızca açılış parantezinden sonraki ilk karakter ise, karakter sınıfının içeriğini geçersiz kılar.
Tim Pietzcker

Bir dizi beyaz boşlukla başlayan ve $0~/\s*^\s/ardından beyaz boşluk olmayan herhangi bir karakter gelen aşağıdaki eşleşme satırı
Alexander Cska

1
Bu muhtemelen /^\s+/- satır başlangıcı ve ardından bir veya daha fazla boşluk karakteri olmalıdır.
Tim Pietzcker

1
@AlexanderCska, bunu çözdün mü? Yukarıdaki cevap yalnızca bir dizenin ilk eşleşmesini döndürür. Tüm eşleşmelerin döndürülmesini istiyorsanız, gdeğiştiriciyi ekleyin . /[^\s\\]/g
Ben Carp

14

Bir bakış kullanabilirsiniz:

/(?=\S)[^\\]/

2
Bir boşluk değilse ileriye bakar. Ve sonra negatif sınıf, sınıfınızdaki karakterler dışında herhangi bir şeyi (boşluk olmayan) kabul eder.
Denis de Bernardy

Bu çözümü beğendim. "Bana boşluk hariç tüm sözcük olmayan karakterleri ver" gibi şeyler için iyidir:/(?=\S)\W/
jocull

Tırnak olmayanların yanı sıra herhangi bir boşluk olmayan karakterle eşleşmem gereken bir durum yaşadım. Ayrıca SPACES'e de izin vermeliydi. Ör: THIS IS A TEST, AND AGAIN. Aşağıdakiler benim için iyi çalıştı (?=\S)[^"]*.
Arvo Bowen

kabul edilen cevap benim için işe yaramadı ama bu işe yaradı. bunu mükemmel metin normal ifade aramasında kullanıyordum
Christian Noel

5

Bu, sed kullanarak benim için çalıştı [ Düzenle: aşağıdaki yorum, sed'in desteklemediğine işaret ediyor]

[^ ]

süre

[^\s] 

yapmadı

# Delete everything except space and 'g'
echo "ghai ghai" | sed "s/[^\sg]//g"
gg

echo "ghai ghai" | sed "s/[^ g]//g"
g g

3
\sboşluk karakterinden daha fazlasıyla eşleşir. Bu TAB, linefeed satırbaşı ve diğerleri (nasıl dahil birçok diğerleri regex lezzet bağlıdır). Bu bir Perl icadı, orijinal olarak POSIX karakter sınıfının kısaltmasıdır [:space:]ve içinde desteklenmez sed. Yukarıdaki ilk normal ifadeniz olmalıdır s/[^[:space:]g]//g.
Alan Moore

Yup @AlanMoore çalışır: echo "ghai ghai" | sed "s/[^[:space:]g]//g" Verim:g g
storm_m2138

1

Sistemimde: CentOS 5

\sKoleksiyonların dışında kullanabilirim ama koleksiyonların [:space:]içinde kullanmak zorundayım . Aslında [:space:]sadece iç koleksiyonları kullanabiliyorum . Yani bunu kullanarak tek bir alanı eşleştirmek için [[:space:]] Hangisini kullanmalıyım gerçekten garip.

echo a b cX | sed -r "s/(a\sb[[:space:]]c[^[:space:]])/Result: \1/"

Result: a b cX
  • eşleştiğim ilk boşluk \s
  • alternatif olarak eşleştirdiğim ikinci boşluk [[:space:]]
  • XI "boşluk yok ama tümü" ile eşleşir [^[:space:]]

Bu ikisi işe yaramayacak:

a[:space:]b  instead use a\sb or a[[:space:]]b

a[^\s]b      instead use a[^[:space:]]b

1
Sed 4.4'ten itibaren, bunun ([^[:space:]])yerine kullanmak zorunda olduğunuz görünüşe göre hala doğru ([^\s]). OpenSUSE Tumbleweed 2018 04
03'teyim.
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.