2010-05-23 3 views
4

Par exemple, pour cette chaîne,regex: match-espaces blancs qui ne sont pas enfermés dans []

div.img-wrapper img[title="Hello world"] 

Je veux faire correspondre le premier espace, mais pas le second espace (qui est enfermé dans []) . Quel est le regex?

+1

Besoin d'un parseur CSS? – kennytm

+0

Sorte de. Je travaille sur un sélecteur CSS au convertisseur xpath. Le framework Zend est livré avec un sélecteur CSS vers le convertisseur xpath, mais il est buggé. – powerboy

Répondre

4

L'expression suivante effectuera le travail en utilisant une assertion anticipée.

_(?>[^[\]]*(\[|$)) 

Le trait de soulignement représente un espace. Cette expression ne prend pas en charge les parenthèses imbriquées car les expressions régulières ne sont pas assez puissantes pour exprimer les structures correspondantes imbriquées. solution en utilisant un regard négatif affirmation avant

_   Match the space and 
(?>  assert that it is not inside brackets 
    [^[\]]* by matching all characters except brackets 
    (  followed by either 
    \[  an opening bracket (a space inside brackets 
      will have a closing bracket at this position) 
    |  or 
    $  or no more characters (end of line). 
) 
) 

MISE À JOUR

Voici une autre (et plus belle).

_(?![^[\]]*]) 

Il affirme que le crochet suivant après un espace n'est pas un crochet de fermeture.

+0

_ (?! [^ []] *]) Est exactement ce que j'utilise. Il peut affirmer que le _ n'a pas de suite], mais il peut affirmer qu'il n'a pas de précédent [. Mais de toute façon, il sert le serveur. Je veux juste savoir comment combiner l'assertion de lookahead avec l'assertion de lookbehide – powerboy

+0

Le regard négatif derrière l'assertion pour aucune parenthèse d'ouverture doit être quelque chose comme (?

0

Ne correspond pas (divisé?) L'espace. Au lieu de cela, faites correspondre son négatif.

(?:(?:\[[^\]]*\])|\S)+ 

Ceci n'est pas conçu pour correspondre à tous les sélecteurs CSS, juste votre exemple. Vous devriez obtenir un analyseur CSS pour des résultats fiables.

+0

effectivement cela détecte tous les espaces pour moi si je l'essaie sur http://www.regextester.com/index2.html –

Questions connexes