2010-10-19 4 views
5

Comment puis-je dire, dans les expressions régulières:Aide à l'expression régulière particulière - Non contenant une chaîne de caractères

Toute partie d'une chaîne commençant par une lettre majuscule, contenant au moins un caractère d'espace, ne contenant pas la chaîne
" _ " (espace de soulignement de l'espace), et se terminant par la chaîne "!!!" (sans les citations)?

J'ai des problèmes avec la partie "ne contenant pas".

Voici ce que j'ai jusqu'à présent:

[A-Z].* .*!!! 

Comment puis-je modifier cette option pour spécifier aussi « ne contenant pas « _ » »?

Il n'est pas nécessaire que ce soit la chaîne spécifique "_". Comment puis-je dire "ne contenant pas" UNE chaîne? Par exemple ne contenant pas "chien"?

Modifier: Je voudrais que la solution soit compatible avec la "preg_replace" de Php

Modifier: Exemples:

Exemples pour "_":

Abc xyz !!! < --- Correspondances

Hello World !!! < --- Correspondances

A _ Space Underscore Space !!! < --- Ne correspond pas à

Exemples pour "chien":

Quel chien !!! < --- Ne correspond pas, (contient "dog")

Bonjour Monde !!! < --- Correspondances

+4

Bonjour, quelle langue utilisez-vous? Perl Reg.exps? ECMAScript? – Benoit

+0

Pouvez-vous poster quelques exemples de chaînes valides/invalides? – Kobi

Répondre

2

L'expression correspond à x(?!y)x que si elle est pas immédiatement suivi par y. Donc, cela semble être la chose que vous voulez:

[A-Z](?!%s)(.(?!%s))* (.(?!%s))*!!! 

%s est votre chaîne interdite.

1

Toute regex possible pour cela serait probablement beaucoup plus compliquée que deux regex. Un comme le vôtre: [A-Z].* .*!!! et le second appliqué sur des chaînes appariées et vérifiant si _ est contenu.

+0

Malheureusement, j'ai besoin de "capturer" la partie correspondante de la chaîne, donc j'ai besoin d'une seule regex pour cela. – Joshua

0

Commencer par Toute capitale; avoir une chaîne optionnelle de tout, sauf un trait de soulignement, un espace, puis le tout sauf le trait de soulignement, suivi de trois points d'exclamation.

[A-Z][^_]*[ ][^_]*!!! 
+0

Ne correspondra pas 'Abc_d ef !!!' – Benoit

+0

Comment est-ce que j'appliquerais ceci dans le cas de l'exemple "chien", dans mon édition ci-dessus? – Joshua

0

Premier test de votre chaîne pour toute occurence de "_", puisque c'est un pas de match. Ensuite, vérifiez ce que vous voulez.

C'est ce que je ferais au lieu de passer beaucoup de temps à essayer de trouver une expression régulière pour cela.

est ici un beau site pour tester vos expressions: Nregex

Modifier: Je lis un peu plus sur votre question et de voir que ma réponse n'a pas été très bon, donc voici une autre tentative. Une modification de l'une des expressions ci-dessus:

[A-Z](?! _)(\w(?! _))* (\w(?! _))*!!! 
0
[A-Z]([^ ]*(?! _) ?)*!!! 

Edit: I Missed vos besoins pour au moins un espace. Le dessous regex comprend cette exigence:

[A-Z][^ ]* (?!_)((?! _).)*!!! 
0

J'utilisé pour le résoudre via l'option de -vgrep (si je suis sur Linux et/ou peuvent utiliser grep).

Alors cherchez quelque chose, puis passez les parties inintéressantes.

grep something <INPUT> | grep -v uninteresting 

Sans grep (damner fenêtres, sans droits d'administrateur) mais avec Vim:

vim -c "v/i'm searching for this/d" -c "g/and don't need this/d" -c "w checkoutput" <INPUT> 

(Cela ouvre, supprime ensuite chaque ligne ce qui ne correspond pas à ce dont vous avez besoin, supprime alors chaque ligne, ce vous ne avez pas besoin, puis enregistrez les résultats que checkoutput. ce qui vous devriez vérifier.)

HTH

Questions connexes