Jak szukać wystąpień więcej niż jednej spacji między słowami w wierszu

109

Jak szukać wystąpień więcej niż jednej spacji między słowami w wierszu

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

Wszystkie powyższe są poprawnymi dopasowaniami dla tego wyrażenia regularnego. Jakiego wyrażenia regularnego powinienem użyć?

Sam
źródło
Czy próbujesz sprawdzić kolejne spacje czy wszystkie spacje w tym wierszu?
Sachin Shanbhag
kolejne spacje nie wszystkie spacje
Sam
1
Co dokładnie masz na myśli mówiąc „między słowami”? W dwóch z twoich przykładów istnieje wiele spacji między słowem a cyfrą. A co z interpunkcją (na przykład, czy chcesz dopasować wiele spacji po kropce i przed następnym słowem)? A co ze spacjami przed / po ostatnim znaku w wierszu? Czy chcesz też dopasować karty? A co z liniami, które składają się wyłącznie z białych znaków?
Tim Pietzcker
spacje między „zawierającym i 2”, „zawierającym i 3”, „pierwszym i drugim”, „drugim i trzecim” ... Tak, chcę dopasować spacje po kropce i przed następnym słowem.
Sam

Odpowiedzi:

180
[ ]{2,}

SPACJA (2 lub więcej)

Możesz również sprawdzić, czy przed i po tych spacjach następują słowa. (nie inne spacje, takie jak tabulatory lub nowe wiersze)

\w[ ]{2,}\w

to samo, ale możesz także wybrać (przechwycić) tylko przestrzenie do zadań, takich jak wymiana

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

lub zobacz, że przed i po spacji jest cokolwiek, nie tylko znaki słów (z wyjątkiem białych spacji)

[^\s]([ ]{2,})[^\s]
AlexanderMP
źródło
1
\woznacza „znaki słowne”, czyli znaki alfanumeryczne i podkreślenia, ale nie inne znaki niebędące spacjami. Aby sprawdzić, czy nie ma białych znaków, użyj \S(duże S). Ponadto pierwszy z nich dopasuje tylko wiersze zawierające dwie lub więcej spacji i nic więcej.
tdammers
Próbowałem rozwinąć pytanie. Zrozumiałem, że przegapiłem to, co powiedziałeś \S, po prostu wolę nie polegać na wielkości liter dla takiej funkcjonalności, jest łatwiejszy do odczytania.
AlexanderMP,
1
Dlaczego w ogóle używasz kotwic? Szuka przestrzeni osadzonych gdzieś w liniach.
Tim Pietzcker
Bez szczególnego powodu. Na początku myślałem, że ich potrzebuję, więc ciągnąłem je przez cały proces. Właściwie masz rację, że się mylę, używając ich w tym przypadku. Zmienię odpowiedź od razu.
AlexanderMP,
1
\w[ ]{2,}\wnie uda się dopasować word.<2 spaces>more wordslub ciąg składający się wyłącznie ze spacji. [^\s]([ ]{2,})[^\s]\wnie powiedzie się na linii, które zaczynają się od spacji lub strun jak bla<2 spaces>....
Tim Pietzcker
12

Proste rozwiązanie:

/\s{2,}/

To dopasowuje wszystkie wystąpienia jednego lub więcej białych znaków. Jeśli chcesz dopasować całą linię, ale tylko wtedy, gdy zawiera ona dwa lub więcej następujących po sobie białych znaków:

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

Jeśli spacje nie muszą następować po sobie:

/^(.*\s.*){2,}$/
tdammers
źródło
.*jest zwykle chciwi, co oznacza, że osiągnie koniec badanego łańcucha, a wszystko, co następuje, jeżeli nie są wymagane znaki, nie będzie pasował. Zwykle w tym przypadku dobrą praktyką jest dodawanie w ?ten sposób .*?. Zdarzyło mi się to przy użyciu PCRE PHP
AlexanderMP
Pasuje. „Chciwy” oznacza, że ​​dopasowuje się tak bardzo, jak to możliwe, jednocześnie dopasowując wzorzec jako całość. /^.*b.*$/faktycznie pasuje "foobar", nawet jeśli można by się spodziewać, że pierwszy chciwy .*dopasuje już cały ciąg.
tdammers
9

To wyrażenie regularne wybiera wszystkie spacje, możesz tego użyć i zastąpić je pojedynczą spacją

\s+

przykład w pythonie

result = re.sub('\s+',' ', data))
Owen Yuwono
źródło
4

Wyszukaj [ ]{2,}. Spowoduje to znalezienie dwóch lub więcej sąsiednich pól w dowolnym miejscu linii. Dopasuje również spacje wiodące i końcowe, a także linie składające się wyłącznie ze spacji. Jeśli tego nie chcesz, sprawdź odpowiedź Alexandra.

Właściwie możesz pominąć nawiasy, są one tylko dla przejrzystości (w przeciwnym razie powtarzający się znak spacji nie jest tak dobrze widoczny :)).

Problem \s{2,}polega na tym, że będzie również dopasowywać znaki nowej linii w plikach systemu Windows (gdzie znaki nowej linii są oznaczone CRLFlub \r\ndopasowane przez \s{2}.

Jeśli chcesz również znaleźć wiele tabulatorów i spacji, użyj [ \t]{2,}.

Tim Pietzcker
źródło
more than one space between words in a line. Jaka jest [ ]{2,}między słowami? Czy w ogóle przeczytałeś pytanie?
AlexanderMP,
Dlatego odniosłem się do twojej odpowiedzi na wypadek, gdyby PO naprawdę chciał być tak surowy, jak pisze. Może powinniśmy go zapytać.
Tim Pietzcker
2

Oto moje rozwiązanie

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

Spowoduje to usunięcie wszystkich cyfr, przecinków i nowych wierszy, ale wybierz środkową przestrzeń, na przykład zestaw danych

  • 20171106,16632 ESCG0000018SB
  • 20171107,280 ESCG0000018SB
  • 20171106,70476 ESCG0000018SB
Ojitha
źródło