2009-09-04 5 views
2

Comment puis-je faire correspondre U1234, mais pas \ U1234 dans Javascript?Javascript Expression régulière pour correspondre à la chaîne à moins que précédée par une barre oblique inverse

Je n'arrive pas à comprendre comment ne pas correspondre à la seule barre oblique inverse. Le plus proche que je peux obtenir est:

\[\\]{0}U[0-9]{4}\b 

Mais cela ne fonctionne pas. Des suggestions?

+0

Voici un conseil que j'ai reçu plus tôt cette année, utilisez http://www.regexpal.com/ pour tester votre regex. Les résultats immédiats vous permettent de passer plus de temps à claquer le motif correct. Je l'aime – thorncp

Répondre

9

JavaScript ne supporte certainement pas les assertions lookbehind. La meilleure façon d'obtenir ce que vous voulez, à mon avis, serait

(?:^|[^\\])(U[0-9]{4}) 

Explication:

(?:   # non-capturing group - if it matches, we don't want to keep it 
^  # either match the beginning of the string 
    |   # or 
    [^\\]  # match any character except for a backslash 
)   # end of non-capturing group 
(U\d{4})  # capturing group number 1: Match U+4 digits 
+1

+1 ce que je mettrais, avant que SO soit allé tous les 503 sur nous ... – bobince

+1

+1 pour expliquer la regex – nickf

+1

oh, sur un point de nit-picky de note, si vous voulez correspondre 0, 1, 2 .. 9 alors vous devriez utiliser '[0-9]'. '\ d' correspond en fait beaucoup plus que 0-9 .. il y a beaucoup de caractères Unicode qui sont des nombres dans différents jeux de caractères. – nickf

1

[^\\]U[0-9]{4} ou quelque chose le long de ces lignes. Il ne correspondra pas à la séquence au tout début de la chaîne de sujet ...

+0

Échapper à ce slash dans le jeu de caractères nié; il est en train d'échapper à la parenthèse de fermeture à la place ... Essayez [^ \\\] U [0-9] {4} –

+0

Merci, Chris. Édité. –

0

Malheureusement, JS ne semble pas prendre en charge la syntaxe appropriée pour cela, c'est-à-dire l'assertion de retour /(?<!\\)U[0-9]{4}/.

Vous devez utiliser:

/[^\\]U[0-9]{4}/ 

Ceci est la syntaxe pour regexp littérale. Si vous mettez regexp dans une chaîne, vous devez échapper à nouveau antislashs:

"[^\\\\]U[0-9]{4}" 
0

Je suggère d'utiliser lookbehind, mais JavaScript doesn't seem to support it. Peut-être que vous pouvez faire une correspondance sur U [0-9] {4}, trouver où se trouve la correspondance, et vérifier le caractère à sa gauche pour voir si c'est un \ ou non?

0

RegExp de JavaScript ne supporte pas regarder en arrière affirmations négatives. Les idées qui vous proposent de faire correspondre seulement/[^ \] U/vont correspondre à des chaînes comme "_U", donc ce n'est pas la réponse. Votre meilleur pari est d'utiliser deux expressions régulières, le premier pour trouver toutes les occurrences, puis le second pour filtrer le look-behind.

"\\U0000 U0000".match(/\\?U[0-9]{4}/g) 
.filter(function (match) { 
    return !/^\\/.test(match) 
}) 
0

Hummm ... est \^U [0-9] {4} \ b fonctionne pour vous?

Questions connexes