2010-11-03 9 views
12

Dans une récente interview, on m'a demandé de déchiffrer cette regexQue signifie cette expression régulière?

^\^[^^] 

Pouvez-vous s'il vous plaît me aider. Aussi s'il vous plaît fournir quelques liens où je peux apprendre regex pour des entrevues.

+2

Il serait beaucoup plus clair si vous avez posté l'expression régulière réelle, pas la chaîne Java avec ses bbaacckkssllllaasshhesses douloureuses et parfois trompeuses. – tchrist

+1

@tchrist - pourquoi? il a dit que ** cette séquence de caractères lui a été donnée dans une interview, une interview liée à Java, je suppose, en regardant l'étiquette. (BTW - la balise regex a été ajoutée par quelqu'un d'autre, à l'origine il a été étiqueté Java uniquement) –

+1

@Andreas_D, je déteste admettre combien de fois j'ai foiré une regex Java à cause du problème de backslash. Maintenant, je les lis à partir d'un fichier d'accessoires ou en tant qu'argument de ligne de commande pour essayer d'éviter le problème. Même ainsi, il y a une grande différence entre un littéral Java utilisé comme regex et une regex réelle. C'est comme se battre avec la coquille, mais pire. – tchrist

Répondre

30

Il correspond à des chaînes qui BEGIN avec ^ suivie tout caractère autre que^.

Il égalerait:

^foo 
^b 

mais pas

foo 
^^b 

Explication:

Caret (^) est un caractère regex méta avec deux significations différentes:

En dehors de la classe de caractères (1ère utilisation dans votre regex) fonctionne comme start ancre.

intérieur la classe de caractères, il agit comme négateursi utilisé comme premier caractère de la classe de caractères (3e utilisation dans votre regex).

La précédation d'une regex avec \ lui échappe (le rend non-spécial). La 2ème utilisation de ^ dans votre expression régulière est échappée et elle correspond à la valeur littérale ^ dans la chaîne.

l'intérieur d'une classe de personnage qui est un ^pas le premier caractère de la classe de caractères est traité littéralement. Donc la 4ème utilisation dans votre regex est un littéral ^.

Quelques exemples à préciser:

  • ^a                  : Matchs commençant chaîne avec a
  • ^ab              : chaîne Correspondances commençant le avec a suivi par b
  • [a]              : correspond à une chaîne qui a un a
  • [^a]          : correspond à une chaîne qui ne dispose pas d'un a
  • ^a[^a]: Ma tappe une chaîne en commençant par un a suivi de tout caractère autre que a.
+1

C'est vrai si vous supposez que cette expression regex est entre guillemets. Sinon, ce serait un «\» littéral. –

+2

@Matt: J'ai supposé cela à cause de l'étiquette java. – mkb

+3

@Matt, je pense que c'est une hypothèse sûre étant donné que si l'antislash littéral était destiné, l'expression rationnelle n'aurait jamais correspondu à aucune chaîne. –

2

début de match de la ligne ou une chaîne suivie d'un littéral \ suivi du début de la ligne ou une chaîne suivi d'un caractère qui n'est pas un espace, retour ou caractère de nouvelle ligne

+0

Voici un site populaire pour apprendre regex: http://www.regular-expressions.info/tutorial.html –

+0

C'est faux: vous ne pouvez pas avoir deux marqueurs de début de chaîne/ligne via '^' sauf si vous êtes dans '(? m)' mode. La réponse la plus évidente est qu'il s'agit de lignes qui commencent par un caractère circonflexe suivi par un caractère non-circonflexe, mais c'est difficile à dire à cause des slackbashes stooopid Java. – tchrist

+0

Je n'ai pas dit que c'était correct ou correspondrait à n'importe quoi. Je viens de dire ce qu'il dit. –

2

Le premier ^ est le début de la ligne.

Le second est un caractère littéral de ^ (\ est d'échapper à l'autre sens habituel du ^)

Le troisième est-à-dire

une classe de caractères qui ne comprend pas la caractère ^

Quelques exemples pour montrer à l'aide Ruby:

ruby-1.9.2-p0 > "hello" =~ /^h/ # it found a match at position 0 
=> 0 

ruby-1.9.2-p0 > "hello" =~ /^e/ # nil means can't find it 
=> nil 

ruby-1.9.2-p0 > "he^llo" =~ /\^/ # found at position 2 
=> 2 

ruby-1.9.2-p0 > "he^llo"[/[^^]*/] # anything repeatedly but not including the^character 
=> "he" 
+1

Excellente réponse. – aioobe

+0

@ 動靜 能量 - vous avez ignoré "le second" dans vos exemples - il ne correspondra que si les chaînes commencent par un '^'. Et ce '^' fait partie de la correspondance ("^ hel^lo" -> "^ hel") –

+0

le troisième cas dans l'exemple est de montrer la correspondance du littéral '^' ... c'est ce que vous voulez dire ? –

3

Je suis en train de tester cette regex here mais cela ne semble pas être valide.
Le premier ^ indique le début de la ligne.
La première \ échappe la suivante \. Enfin le premier signe à l'intérieur des crochets [^ agit comme la négation et le second ^] n'est pas échappé car il n'est pas valide. À mon humble avis l'expression correcte doit être ^\^[^\^]
Les gars, veuillez confirmer.Merci beaucoup

+2

Je pense qu'il y a une supposition implicite que c'est entre guillemets, de sorte que les deux barres obliques inverses sont nécessaires pour échapper au second signe. –

+0

Merci pour cela, juste pour m'assurer – Philar

Questions connexes