2010-09-21 11 views
65

Comment rechercher des occurrences de plus d'un espace entre les mots dans une ligneComment rechercher des occurrences de plus d'un espace entre les mots dans 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 ci-dessus sont des matchs valides pour ce regex. Quel regex devrais-je utiliser?

+0

Essayez-vous de vérifier des espaces vides consécutifs ou tous les espaces dans cette ligne ? –

+0

espaces vides consécutifs pas tous les espaces – Sam

+1

Qu'entendez-vous exactement par «entre les mots»? Dans deux de vos exemples, il existe 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 consistent qu'en des espaces blancs? –

Répondre

105
[ ]{2,} 

SPACE (2 ou plus)

Vous pouvez également vérifier que avant et après ces espaces mots suivent. (Pas d'autres espaces comme des onglets ou de nouvelles lignes)

\w[ ]{2,}\w 

même, mais vous pouvez aussi choisir (capture) que les espaces pour des tâches telles que le remplacement

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

ou voir que, avant et après les espaces là-bas est quelque chose, non seulement des caractères de mot (sauf espaces)

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

'\ w' signifie 'caractères de mot', c'est-à-dire alphanumérique et trait de soulignement, mais pas les autres caractères non-espace. Pour vérifier l'absence de blanc, utilisez '\ S' (capital S). En outre, le premier ne correspondra aux lignes qui contiennent deux ou plusieurs espaces et rien d'autre. – tdammers

+0

J'ai essayé d'évoluer la question. J'ai compris que j'ai manqué ce que vous avez dit avec '\ S', je préfère simplement ne pas compter sur le cas de caractère pour une telle fonctionnalité, c'est plus facile à lire. – AlexanderMP

+1

Pourquoi utilisez-vous des ancres? Il cherche des espaces intégrés quelque part dans les lignes. –

7

solution simple:

/\s{2,}/ 

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

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

Si les espaces blancs ne pas besoin d'être consécutives:

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

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 '. *?'. Il m'est arrivé en utilisant PHP's PCRE – AlexanderMP

+0

Il ne correspond pas. "Greedy" signifie qu'il correspond autant que possible tout en continuant à correspondre au motif dans son ensemble. '/ ^.* b. * $ /' correspond en fait à '" foobar "', même si vous vous attendez à ce que le premier 'avide '. *' corresponde déjà à la chaîne entière. – tdammers

2

Rechercher [ ]{2,} . Cela va trouver deux ou plusieurs espaces adjacents n'importe où dans la ligne. Il va également faire correspondre les espaces de début et de fin ainsi que les lignes composées entièrement d'espaces. Si vous ne le voulez pas, consultez la réponse d'Alexander.

En fait, vous pouvez omettre les parenthèses, elles sont juste pour la clarté (sinon le caractère d'espace qui est répété n'est pas si bien visible :)).

Le problème avec \s{2,} est qu'il sera également correspondre à des sauts de ligne sur les fichiers Windows (où les nouvelles lignes sont désignées par CRLF ou \r\n qui est compensée par \s{2}.

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

+0

'plus d'un espace entre les mots d'une ligne'. Comment '[] {2,}' entre les mots? Avez-vous même lu la question? – AlexanderMP

+0

C'est pourquoi je me suis référé à votre réponse au cas où le PO voudrait être aussi strict que lui. Peut-être que nous devrions lui demander. –

0

Voici ma solution

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

Cela supprimera tous les chiffres, les virgules et les nouvelles lignes, mais sélectionnez le MIDD le espace tel ensemble de données de

  • 20171106,16632 ESCG0000018SB
  • 20171107.280 ESCG0000018SB
  • 20171106,70476 ESCG0000018SB