Comment rechercher des occurrences de plus d'un espace entre les mots d'une ligne

109

Comment rechercher des occurrences de plus d'un espace entre les mots d'une ligne

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

Tous les éléments ci-dessus sont des correspondances valides pour cette expression régulière. Quelle regex dois-je utiliser?

Sam
la source
Essayez-vous de vérifier les espaces vides consécutifs ou tous les espaces de cette ligne?
Sachin Shanbhag
espaces blancs consécutifs pas tous les espaces
Sam
1
Qu'entendez-vous exactement par «entre les mots»? Dans deux de vos exemples, il y a plusieurs espaces entre un mot et un chiffre. Qu'en est-il de la ponctuation (par exemple, voulez-vous faire correspondre plusieurs espaces après un point et avant le mot suivant)? Qu'en est-il des espaces avant / après le dernier caractère d'une ligne? Voulez-vous également faire correspondre les onglets? Qu'en est-il des lignes qui ne contiennent que des espaces?
Tim Pietzcker
espaces entre "contenant et 2", "contenant et 3", "premier et deuxième", "deuxième et trois" ... Oui, je veux faire correspondre les espaces après un point et avant le mot suivant.
Sam du

Réponses:

180
[ ]{2,}

ESPACE (2 ou plus)

Vous pouvez également vérifier qu'avant et après ces espaces, les mots suivent. (pas d'autres espaces comme des tabulations ou de nouvelles lignes)

\w[ ]{2,}\w

la même chose, mais vous pouvez également choisir (capturer) uniquement les espaces pour des tâches comme le remplacement

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

ou voir qu'avant et après les espaces, il y a quelque chose, pas seulement des caractères de mots (sauf les espaces)

[^\s]([ ]{2,})[^\s]
AlexanderMP
la source
1
\wsignifie «caractères de mots», c'est-à-dire alphanumériques et traits de soulignement, mais pas les autres caractères non espace. Pour vérifier les espaces non blancs, utilisez \S(S majuscule). De plus, le premier ne correspondra qu'aux lignes contenant deux espaces ou plus et rien d'autre.
tdammers
J'ai essayé de faire évoluer la question. J'ai compris que j'ai raté ce que vous avez dit avec \S, je préfère juste ne pas me fier à la casse des caractères pour une telle fonctionnalité, c'est plus facile à lire.
AlexanderMP
1
Pourquoi utilisez-vous des ancres? Il cherche des espaces encastrés quelque part dans les lignes.
Tim Pietzcker
sans raison particulière. Au début, je pensais que j'avais besoin d'eux, alors je les ai traînés tout au long du processus. En fait, vous avez raison de dire que j'ai tort de les utiliser dans ce cas. Je modifierai ma réponse tout de suite.
AlexanderMP
1
\w[ ]{2,}\wne correspondra pas word.<2 spaces>more wordsou une chaîne qui se compose entièrement d'espaces. [^\s]([ ]{2,})[^\s]\wéchouera sur les lignes commençant par des espaces ou des chaînes comme bla<2 spaces>....
Tim Pietzcker
12

Solution simple:

/\s{2,}/

Cela correspond à toutes les occurrences d'un ou de plusieurs caractères d'espacement. Si vous devez faire correspondre la ligne entière, mais uniquement si elle contient deux ou plusieurs caractères d'espacement consécutifs:

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

Si les espaces n'ont pas besoin d'être consécutifs:

/^(.*\s.*){2,}$/
tdammers
la source
le .*est généralement gourmand, ce qui signifie qu'il atteindra la fin de la chaîne testée, et tout ce qui suit, s'il y a des caractères obligatoires, ne correspondra pas. Habituellement, dans ce cas, c'est une bonne pratique d'ajouter ?, comme ceci .*?. Cela m'est arrivé en utilisant le PCRE de PHP
AlexanderMP
Cela correspond. «Greedy» signifie qu'il correspond autant que possible tout en correspondant au modèle dans son ensemble. /^.*b.*$/correspond en fait "foobar", même si vous vous attendez à ce que le premier gourmand .*corresponde déjà à la chaîne entière.
tdammers
9

Cette regex sélectionne tous les espaces, vous pouvez l'utiliser et la remplacer par un seul espace

\s+

exemple en python

result = re.sub('\s+',' ', data))
Owen Yuwono
la source
4

Recherchez [ ]{2,}. Cela trouvera deux ou plusieurs espaces adjacents n'importe où dans la ligne. Il correspondra également aux espaces de début et de fin ainsi qu'aux lignes constituées entièrement d'espaces. Si vous ne voulez pas cela, consultez la réponse d'Alexandre.

En fait, vous pouvez omettre les crochets, ils sont juste pour plus de clarté (sinon le caractère d'espace qui est répété n'est pas très visible :)).

Le problème avec \s{2,}est qu'il correspondra également aux retours à la ligne sur les fichiers Windows (où les retours à la ligne sont indiqués par CRLFou \r\ncorrespondent à \s{2}.

Si vous souhaitez également rechercher plusieurs onglets et espaces, utilisez [ \t]{2,}.

Tim Pietzcker
la source
more than one space between words in a line. Comment se passe-t-il [ ]{2,}entre les mots? Avez-vous même lu la question?
AlexanderMP
C'est pourquoi j'ai fait référence à votre réponse au cas où le PO voudrait vraiment être aussi strict qu'il écrit. On devrait peut-être lui demander.
Tim Pietzcker
2

Voici ma solution

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

Cela supprimera tous les chiffres, virgules et nouvelles lignes mais sélectionnez l'espace du milieu tel que l'ensemble de

  • 20171106,16632 ESCG0000018SB
  • 20171107,280 ESCG0000018SB
  • 20171106,70476 ESCG0000018SB
Ojitha
la source