2010-09-12 2 views
3

QuestionQu'est-ce que cela signifie lorsqu'une expression régulière est entourée de symboles @?

Qu'est-ce que cela signifie lorsqu'une expression régulière est entourée de symboles @? Cela signifie-t-il quelque chose de différent d'être entouré de barres obliques? Qu'en est-il de quand @x ou @i sont à la fin? Maintenant que j'y pense, que signifient les slashes environnants?


Contexte

J'ai vu this StackOverflow answer, publié par John Kugelman, dans lequel il affiche des compétences sérieuses Regex.

Maintenant, je suis habitué à voir regexes entouré par des barres obliques comme dans

/^abc/ 

Mais il a utilisé un regex entouré de symboles @:

'@ 
     ^% 
     (.{2})   # State, 2 chars 
     ([^^]{0,12}.) # City, 13 chars, delimited by^
     ([^^]{0,34}.) # Name, 35 chars, delimited by^
     ([^^]{0,28}.) # Address, 29 chars, delimited by^
     \?$ 
@x' 

En fait, il semble être en le format:

@^[email protected] 

En train d'essayer de google ce que cela signifie (c'est une question difficile à google!), je suis aussi w le format:

@^[email protected] 

Il est clair que le x et i ne sont pas adaptés caractères.

Alors qu'est-ce que tout cela signifie ???

Merci à l'avance pour tout et toutes les réponses,

-gMale

+0

Lisez dans la documentation PHP sur les délimiteurs: http://www.php.net/manual/fr/regexp.reference.delimiters.php Cela devrait rendre tout clair. –

+0

merci pour le super lien. Cela m'a conduit à un autre bon lien qui explique tous les * modificateurs de pattern *. Je suppose que tout cela s'applique à plus que PHP. http://www.php.net/manual/fr/reference.pcre.pattern.modifiers.php – gMale

Répondre

5

Les barres obliques environnants ne sont que les délimiteurs regex. Vous pouvez utiliser n'importe quel caractère (afaik) pour le faire - le plus couramment utilisé est le /, autre que j'ai vu quelque peu couramment utilisé est #

Donc en d'autres termes, @[email protected] est essentiellement le même que /whatever/i (i est modificateur pour une correspondance insensible à la casse)

La raison pour laquelle vous pourriez vouloir utiliser autre chose que le/est si votre expression régulière contient le caractère. Vous évitez d'avoir à y échapper, similaire à l'utilisation de '' pour les cordes au lieu de ''.

+0

Bonne réponse! Si * i * est le modificateur de la recherche insensible à la casse, à quoi sert le modificateur * x * a? Connaissez-vous un endroit qui pourrait expliquer cet aspect (les modificateurs) en détail? Toutes les choses regex que je google ne couvre que les bases et je connais parfaitement les bases. – gMale

+1

Le modificateur 'x' invoque le mode d'espacement libre: http://www.regular-expressions.info/freespacing.html –

+0

@Delan: merci, c'est une fantastique source d'informations Regex avancées, génériques dans toutes les langues! J'ajoute ceci comme marque-page principal. – gMale

1

Trouvé ceci à partir d'un lien "lié".

Le délimiteur peut être n'importe quel caractère qui n'est pas un caractère alphanumérique, un espace ou une barre oblique inverse.

/ est le délimiteur le plus couramment utilisé, car il est étroitement associé aux littéraux regex, par exemple en JavaScript où ils sont le seul délimiteur valide. Cependant, n'importe quel symbole peut être utilisé.

J'ai vu des gens utiliser ~, #, @, même ! pour délimiter leurs expressions rationnelles d'une manière qui évite d'utiliser des symboles qui sont aussi dans l'expression rationnelle. Personnellement, je trouve cela ridicule.

Un fait moins connu est que vous pouvez utiliser une paire de parenthèses pour délimiter une regex en PHP. Cela présente l'énorme avantage d'avoir une différence évidente entre le délimiteur de fermeture et le symbole apparaissant dans le motif, et n'a donc pas besoin de s'échapper. Ma préférence personnelle est la suivante:

(^abc)i 

en utilisant des parenthèses, je me rappelle que dans un match, $m[0] est toujours le match plein, et les sous-masques commence à $m[1].

+0

Je suis intéressé par votre commentaire concernant les délimiteurs moins conventionnels étant ridicules? Il me semble que les regex sont difficiles à lire dans le meilleur des cas, sans ajouter de jetons '\ /' supplémentaires dans le mixage. Je peux voir l'avantage d'éviter les alternatives à la conformité avec d'autres langues comme vous l'avez souligné, mais alors votre préférence personnelle d'utiliser des parenthèses nie également cette conformité? Mais +1 pour le modèle de parenthèse, je pense que je vais commencer à l'utiliser. Bien que je me demande si elle est rarement utilisée et donc encore plus "obscure" que les autres alternatives plus communément comprises, vous avez souligné? – Sepster

+0

Eh bien, un usage commun doit commencer quelque part, non? ;) Vous l'avez entendu ici la première fois! LOL. Merci pour l'upvote! –

+0

:-) Le mouvement a commencé! Vive la révolution! – Sepster

Questions connexes