Bir satırdaki kelimeler arasında birden fazla boşluk bulunması nasıl aranır?


109

Bir satırdaki kelimeler arasında birden fazla boşluk bulunması nasıl aranır?

1. this is a line containing  2 spaces
2. this is a line containing   3 spaces
3. this is a line containing multiple spaces first  second   three   four

Yukarıdakilerin tümü bu normal ifade için geçerli eşleşmelerdir. Hangi normal ifadeyi kullanmalıyım?


Bu satırdaki ardışık boşlukları mı yoksa tüm boşlukları mı kontrol etmeye çalışıyorsunuz?
Sachin Shanbhag

ardışık boşluklar tüm boşluklar değil
Sam

1
"Sözcüklerin arasında" derken tam olarak ne demek istiyorsun? Örneklerinizden ikisinde, bir kelime ve bir rakam arasında birden fazla boşluk var. Noktalama işaretleri ne olacak (örneğin, bir noktadan sonra ve sonraki kelimeden önce birden çok boşluğu eşleştirmek istiyor musunuz)? Bir satırdaki son karakterden önceki / sonraki boşluklar ne olacak? Sekmeleri de eşleştirmek ister misiniz? Boşluktan başka hiçbir şey içermeyen çizgiler ne olacak?
Tim Pietzcker

"içeren ve 2", "içeren ve 3", "birinci ve ikinci", "ikinci ve üç" arasındaki boşluklar ... Evet, bir noktadan sonra ve sonraki kelimeden önceki boşlukları eşleştirmek istiyorum.
Sam

Yanıtlar:


180
[ ]{2,}

SPACE (2 veya daha fazla)

Bu boşluklardan önce ve sonra kelimelerin gelip gelmediğini de kontrol edebilirsiniz. (sekmeler veya yeni satırlar gibi diğer boşluklar değil)

\w[ ]{2,}\w

aynıdır, ancak yalnızca değiştirme gibi görevler için boşlukları da seçebilirsiniz (yakalayabilirsiniz).

\w([ ]{2,})\w

veya boşluklardan önce ve sonra herhangi bir şey olduğunu görün, sadece kelime karakterleri değil (boşluklar hariç)

[^\s]([ ]{2,})[^\s]

1
\w"kelime karakterleri", yani alfanümerik ve alt çizgi anlamına gelir, ancak diğer boşluk olmayan karakterler anlamına gelmez. Beyaz olmayan alanı kontrol etmek için \S(büyük S) kullanın . Ayrıca, ilki yalnızca iki veya daha fazla boşluk içeren ve başka hiçbir şey içermeyen satırlarla eşleşecektir.
tdammers

Soruyu geliştirmeye çalıştım. Söylediklerinizi özlediğimi anladım, \Ssadece bu tür bir işlevsellik için karakter durumuna güvenmeyi tercih etmiyorum, okunması daha kolay.
AlexanderMP

1
Neden çapa kullanıyorsun? Hatlarda bir yerlerde gömülü boşluklar arıyor.
Tim Pietzcker

Özel bir sebep yok. İlk başta onlara ihtiyacım olduğunu düşündüm, bu yüzden onları süreç boyunca sürükledim. Aslında, bu durumda onları kullandığım için hatalı olduğum konusunda haklısın. Cevabımı hemen düzenleyeceğim.
AlexanderMP

1
\w[ ]{2,}\wword.<2 spaces>more wordstamamen boşluklardan oluşan bir dizge veya eşleşmede başarısız olur . [^\s]([ ]{2,})[^\s]\wboşluklarla veya dizelerle başlayan satırlarda başarısız olur bla<2 spaces>....
Tim Pietzcker

12

Basit çözüm:

/\s{2,}/

Bu, bir veya daha fazla boşluk karakterinin tüm oluşumlarıyla eşleşir. Tüm satırı eşleştirmeniz gerekiyorsa, ancak yalnızca iki veya daha fazla ardışık boşluk karakteri içeriyorsa:

/^.*\s{2,}.*$/

Beyaz boşlukların ardışık olması gerekmiyorsa:

/^(.*\s.*){2,}$/

.*o test dize sonuna ulaşacak ve zorunlu karakterler varsa, aşağıdaki hangi hepsi, maç olmayacak, yani genelde hırslı olduğunu. Genellikle bu durumda, bunun ?gibi eklemek iyi bir uygulamadır .*?. Bu PHP'nin PCRE'yi kullanarak başıma
AlexanderMP

Eşleşiyor. "Açgözlü", modelin bir bütün olarak eşleşmesine rağmen mümkün olduğunca çok eşleştiği anlamına gelir. ilk açgözlünün zaten tüm dizeyle eşleşmesini beklemenize rağmen /^.*b.*$/aslında "foobar"eşleşiyor .*.
tdammers

9

Bu normal ifade tüm boşlukları seçer, bunu kullanabilir ve tek bir boşlukla değiştirebilirsiniz

\s+

python'da örnek

result = re.sub('\s+',' ', data))

4

Arayın [ ]{2,}. Bu, satırın herhangi bir yerinde iki veya daha fazla bitişik boşluk bulacaktır. Ayrıca baştaki ve sondaki boşlukların yanı sıra tamamen boşluklardan oluşan çizgilerle de eşleşecektir. Bunu istemiyorsan Alexander'ın cevabına bir bak.

Aslında, parantezleri dışarıda bırakabilirsiniz, bunlar sadece açıklık içindir (aksi halde tekrarlanan boşluk karakteri o kadar iyi görünmez :)).

Bununla ilgili sorun \s{2,}, Windows dosyalarındaki (satırsonları ile gösterilen CRLFveya ile eşleşen yeni satırlarla da eşleşecek \r\nolmasıdır \s{2}.

Ayrıca birden çok sekme ve boşluk bulmak istiyorsanız, kullanın [ \t]{2,}.


more than one space between words in a line. [ ]{2,}Kelimeler arasında nasıl ? Soruyu okudun mu?
AlexanderMP

Bu yüzden OP'nin yazdığı kadar katı olmak istemesi durumunda cevabınıza değindim. Belki ona sormalıyız.
Tim Pietzcker

2

İşte benim çözümüm

[^0-9A-Z,\n]

Bu, tüm rakamları, virgülleri ve yeni satırları kaldıracak, ancak veri kümesi gibi orta boşluğu seçecektir.

  • 20171106,16632 ESCG0000018SB
  • 20171107,280 ESCG0000018SB
  • 20171106,70476 ESCG0000018SB
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.