2009-02-09 10 views
2

Comment est-ce que je fais ceci avec regex?Un problème d'expression régulière que je n'arrive pas à comprendre (lookbehind négatif)

je veux faire correspondre cette chaîne: -myString

mais je ne veux pas correspondre à la -myString dans cette chaîne: --myString

myString est bien sûr tout.

est-ce encore possible?

EDIT:

est ici un peu plus d'infos avec ce que je suis arrivé à ce jour depuis que je l'ai posté une question:

string to match: 
some random stuff here -string1, --string2, other stuff here 
regex: 
(-)([\w])* 

Cette regex me retourne 3 matches: -string1, - et -string2

idéalement je voudrais qu'il me renvoie seulement le -string1 match

+0

BTW - c'est amusant, et les réponses sont instructives, mais regexs peut ne pas être le bon outil pour le traitement des options (que je soupçonne est ce que vous essayez de faire) – dmckee

+0

bien si je ne peux pas le faire avec regex je le ferai différemment. C'est pourquoi je voulais savoir si c'est possible :) –

+0

Je suis sûr que vous pouvez le faire. Juste pas que c'est la meilleure façon. Cependant, si vous connaissez cette méthode, et ne savez pas (disons) lexxing FSM, et qu'elle ne présente pas de problèmes de performances ou de maintenance inacceptables, n'hésitez pas à m'ignorer. À votre santé. – dmckee

Répondre

11

En supposant que votre moteur de regex supports (négatif) lookbehind :

/(?<!-)-myString/ 

Perl fait, Javascript ne fonctionne pas, f ou exemple.

+0

ma machine regex est celle en .Net. Aucune idée si cela supporte cela. –

+0

C'est le cas. "(? Tomalak

+0

Tomalak, oui c'est exactement ce dont j'avais besoin. Que diriez-vous de mettre cela comme une réponse afin que je puisse le marquer accepté? –

0
/^[^-]*-myString/ 

Test:

[~]$ echo -myString | egrep -e '^[^-]*-myString' 
-myString 
[~]$ echo --myString | egrep -e '^[^-]*-myString' 
[~]$ echo test--myString | egrep -e '^[^-]*-myString' 
[~]$ echo test --myString | egrep -e '^[^-]*-myString' 
[~]$ echo test -myString | egrep -e '^[^-]*-myString' 
test -myString 
0

Vous voulez faire correspondre une chaîne qui commence avec un seul tableau de bord, mais pas celui qui a plusieurs traits?

^-[^-] 

Explication:

^ Matches start of string 
- Matches a dash 
[^-] Matches anything but a dash 
+0

Cela permettrait plus de tirets plus tard dans la chaîne, est-ce correct? –

+0

Les tirets ne sont autorisés qu'au début d'un mot. donc s'il y a un espace plus loin, il peut y avoir des dases après. mais la même règle devrait s'appliquer à eux –

+0

Cela ne correspondrait également qu'à un tiret et à un autre caractère. c'est-à-dire qu'il correspond à -m de -myString. –

0

[^ -] {0,1} - [^ \ w -] +

+0

Selon l'édition d'OP, une correspondance de sous-chaîne est requise, donc les ancres ne fonctionneront pas. – Tomalak

+0

Mis à jour pour l'édition. La seule question est comment il décide comment mettre fin à la partie "mystring". Cet exemple utilise des espaces. –

+0

J'ai peur maintenant qu'il soit complètement cassé. ;-) Je me suis creusé la tête pour trouver une solution simple, mais je ne pense pas qu'il y en ait une, quand une chaîne complète est requise. – Tomalak

0

basé sur la dernière édition, je suppose que l'expression suivante fonctionnerait mieux

\b\-\w+ 
0

sans utiliser apparence autotractées, utilisez:

(?:^|(?:[\s,]))(?:\-)([^-][a-zA-Z_0-9]+) 

éclaté:

(
    ?:^|(?:[\s,])  # Determine if this is at the beginning of the input, 
         # or is preceded by whitespace or a comma 
) 
(
    ?:\-     # Check for the first dash 
) 
(
    [^-][a-zA-Z_0-9]+ # Capture a string that doesn't start with a dash 
         # (the string you are looking for) 
)