2010-08-11 13 views
4

je besoin d'aide pour un problème de RegEx:RegEx pour trouver des mots non seulement d'un espace entre les

Je veux trouver occurences de deux mots connus (« foo » et « bar » par exemple), qui ont tout espace blanc autre que EXACTEMENT UN ESPACE CARACTERE entre eux.

Dans le texte que je dois grep, il peut y avoir des espaces, des tabulations, des CR, des LF ou n'importe quelle combinaison d'entre eux entre les deux mots. En mots RegEx: J'ai besoin d'une expression régulière qui correspond à "foo[ \t\n\r]+bar" mais qui ne correspond pas à "foo bar". Tout ce que j'ai essayé jusqu'ici a manqué certaines combinaisons ou correspondait aussi au cas de l'espace unique qui est le seul qui ne devrait pas correspondre.

Merci d'avance pour toutes les solutions.

EDIT: Pour clarifier, j'utilise RegEx compatible RegEx ici.

Répondre

4

Vous pouvez également utiliser un test avant négatif:

foo(?! \b)\s+bar 

Si les chèques ne sont pas supportés, vous pouvez l'écrire explicitement:

foo(?:[^\S ]| \s)\s*bar 

L'expression [^\S ] inclut un double négatif et il peut ne pas être immédiatement évident comment cela fonctionne. Si vous travaillez sur la logique, cela signifie tout espace en dehors d'un espace.

+0

Cela semble fonctionner. Tour intéressant avec la chose non-non-espace-blanc. Le lookahead est sympa aussi. – selfawaresoup

+0

Je pense, je vais aller avec le lookahead. C'est plus facile de se souvenir et de lire. – selfawaresoup

1

Vous pouvez utiliser (en supposant ERE, à savoir grep -E)

foo[:space:]{2,}bar 

La syntaxe x{min,} signifie que le modèle x doit apparaître au moins min fois.


Si par « autre que un seul caractère ESPACE » vous voulez dire, sauf le caractère d'espace 0x20, vous avez besoin d'une alternance:

foo([\t\n\r]|[ \t\n\r]{2,})bar 
+0

Ces deux manquez les cas où il y a un seul onglet, CR ou LF beteen les mots. – selfawaresoup

+0

@Techpriester: La solution d'alternance devrait fonctionner, et est très lisible. – polygenelubricants

+0

Non, comme d'autres solutions publiées ici, il manque le cas quand il y a un seul "\ t" entre les mots. – selfawaresoup

0

utilisation [: space:] {2,}

{2,} signifie 2 ou plus

+0

Non. Cela manque "foo \ tbar" par exemple. – selfawaresoup