2010-03-05 5 views
3

Je dois utiliser un outil estropié qui ne fournit aucun moyen de couper les espaces arrière d'une chaîne. Il a regex de style .NET, mais seulement Match est mis en œuvre, pas remplacer. Alors, je suis venu (surprise par moi-même) avec cette expression rationnelle qui semble fonctionner .. mais Je ne comprends pas très bien pourquoi cela fonctionne :-)Trim string utilisant reqex match

$trimmed = regex/[^ ].*[^ ]/ ($original_string) 

Pourquoi ce travail, ça marche vraiment dans tous les cas, et est-il une meilleure façon, si vous n'avez match regex (même matches de groupe ne peut pas être capturé :()?

+0

Que retourne cette fonction 'regex //' si la regex ne correspond pas? Une chaîne vide? Toute la chaîne d'origine? –

Répondre

3

Il devrait fonctionner correctement à moins qu'il n'y a qu'un seul caractère entouré de l'espace.

Votre recherche correspond à:

  1. Un caractère non-espace [^ ]
  2. zéro ou plusieurs caractères de toute nature, autant que possible (correspondance gourmand) .*
  3. Un caractère non-espace [^ ]

Donc, s'il aren Au moins deux caractères non-espace (1 et 3), le motif ne correspond pas du tout.

Vous devez utiliser \b au lieu de [^ ], qui correspondent à une «frontière de mot, mais sera de longueur nulle et ne sera pas besoin de deux caractères non-espace:

\b.*\b 
+2

Que faire si le premier ou le dernier caractère non-espace est la ponctuation? Par exemple, '\ b. * \ B' appliqué à' # foo #' retournera 'foo', et ce n'est pas correct. –

+0

Bon point, ce que l'on pourrait utiliser est un lookahead personnalisé et lookbehind pour attraper les espaces ou le début/fin de la chaîne. – Timo

2

Il fonctionne comme ceci: [^ ] correspondra au premier caractère non espace, .* correspondra à n'importe quoi, et [^ ] correspondra à nouveau à un caractère non espace. Étant donné que regex est gourmande, la correspondance la plus longue possible est renvoyée. Dans ce cas, la chaîne la plus longue possible avec deux espaces non aux extrémités finit par écraser les espaces au début et à la fin de $original_string.

Un bon tutoriel sur regex est here, il vous apprend à propos de l'appariement gourmand et paresseux qui sont essentiels pour comprendre et optimiser les regex. Il vous apprend également sur la correspondance entre les caractères, ce qui est ce que vous voulez faire ici (voir la réponse à propos de \ b par Martin).