2017-03-26 4 views
0

RegEx: /@{0,1}\s*x(.*?)x\s*@{0,1}/qu'occuper `character` quand il est précédé/remplacé par` character`

La syntaxe que je suis en train de force est xSomethingx et @[email protected] où les espaces sont autorisés dans les @ « s mais pas quand captured il n'y a pas de @.

doit correspondre:

@ xSomethingx @=>@ xSomethingx @

. xSomethingx .=>xSomethingx

Ce que j'ai essayé jusqu'à: J'ai essayé pas mal looksaheads et lookbehinds à la fois positive et negative mais je ne peux l'obtenir pas à match alors que je ne veux pas capture spaces dans cette situation particulière. J'ai aussi joué un peu avec non-capturing groups.

Des pointeurs ici? Peut clarifier plus si besoin est.

+0

Veuillez fournir d'autres exemples. À partir de maintenant, votre question est plutôt vague et a plusieurs réponses possibles. – Jan

Répondre

1

Regex demo

PHP code demo

Regex: (?:@\s*|)x(?:.*?)x(?:\s*@|)

<?php 
$pattern="/(?:@\s*|)x(?:.*?)x(?:\s*@|)/"; 
preg_match($pattern, "@[email protected]",$matches1); 
preg_match($pattern, "@   xSomethingx @",$matches2); 
preg_match($pattern, ".   xSomethingx     .",$matches3); 
print_r($matches1); 
print_r($matches2); 
print_r($matches3); 

Sortie:

Array 
(
    [0] => @[email protected] 
) 
Array 
(
    [0] => @   xSomethingx @ 
) 
Array 
(
    [0] => xSomethingx 
) 
2

Celui-ci pourrait aussi travailler pour vous:

(?:@\s*)?x(?:.*)x(?:\s*@)? 

-

'@   xSomethingx @'     ; // @   xSomethingx @ 
'.   xSomethingx     .'; // xSomethingx 

Il est un peu différent de celui regex de Sahil Gulati, mais il effectuera certainement le même match.

+0

Il est préférable de transformer un point gourmand en un point non gourmand ''. * ''Même si je préfère personnellement [^ x] *'. – revo

+0

Vraiment besoin que le 'OU' soit NULL. Vous vous attendez à ne pas fournir quelque chose, mais ce n'est pas le cas. Donc, il ne fait pas le même match. Merci quand même! :) – SAz

0

Voici une nouvelle meilleure réponse/modèle pour vous: /(?:@ *)?x.*x(?: *@)?/

Cette traite votre chaîne presque deux fois plus vite que de Sahil parce que son modèle fait l'erreur d'utiliser des tuyaux et un groupe de capture inutile. Vous verrez que j'ai utilisé un quantificateur gourmand sur le point (comme Eduardo) car s'il y a un x dans la sous-chaîne, alors le motif ne capturera pas toute la chaîne voulue - ceci est un échec potentiel dans le modèle de Sahil.

Pattern Demo (insérer le modèle de Sahil pour voir comment il ne correspond pas tout à fait l'une des chaînes.)

Cependant, je voudrais souligner que toutes les réponses sur cette page ne parviennent pas à valider une saisie La chaîne se termine au début. Je veux dire, regardez ma démo regex, @[email protected] ne se termine pas par @ mais ça commence par ça.Pour identifier ces occurrences correctement, un modèle plus étendu doit être conçu. Si cela vous préoccupe, vous devez clarifier cela dans votre question afin que les réponses puissent être mises à jour si nécessaire.