2009-08-05 8 views
0

Je travaille avec un ensemble de données qui doit être nettoyé. Je cherche à remplacer les points d'interrogation (?) Par le code em-dash (—). Voici un exemple de chaîne:Comment faire correspondre et remplacer un caractère non-mot entre des caractères de mot avec RegEx?

« ... arrêtez-le après avoir pris quelques ...? »

je peux correspondre à ce cas avec cette expression: \ w \ \ w Cependant, il correspond un caractère de chaque côté du point d'interrogation. Ainsi, le remplacer ressemble à ceci:

« ... fermer dow — après avoir pris quelques ... »

Comment puis-je correspondre à tout le modèle tout en ne remplaçant le point d'interrogation?

Merci à l'avance, Jason

Répondre

3

S'il est PHP (je fondais que sur d'autres questions que vous avez posées), cela devrait le faire:

$str = preg_replace('/(\w)\?(\w)/i', '\\1—\\2', $str); 
+0

Oui, cette instance particulière je travaillais en php et ce match fonctionne parfaitement! Merci! – JasonBartholme

2

difficile de répondre si nous ne ne sais pas quelle technologie utilisez-vous? Si vous écrivez un JS ce fera

inputStr.replace(/(\w)\?(\w)/, '$1—$2'); 
3

Si la langue que vous utilisez des supports lookarounds, vous pouvez les utiliser pour vous assurer que votre point d'interrogation est entouré par des caractères de mot, mais pas vraiment les capturer:

/(?<=\w)\?(?=\w)/ 

le (?<=\w) est un regard en arrière (le moteur semble « derrière » - avant - un match potentiel) et le (?=\w) est un test avant (le moteur regarde vers l'avenir). Les alertes ne sont pas capturées, donc dans votre cas, seul le point d'interrogation sera, et alors vous pouvez le remplacer.

En PHP, par exemple, vous pouvez ainsi faire:

$string = "...shut it down?after taking a couple of..." 
preg_replace('/(?<=\w)\?(?=\w)/', "&mdash;", $string); 
// results in ...shut it down&mdash;after taking a couple of... 

Lookarounds sont pris en charge par la base PCRE (Perl) compatibles moteurs d'expression régulière, bien que Ruby ne supporte pas les assertions arrières.

+0

Cela fonctionne aussi bien que le modèle de Sean Bright. Php supporte les lookarounds et je vais essayer d'implémenter cette méthode dans d'autres patterns que je devrai bientôt faire correspondre. – JasonBartholme

2

Utilisation: /\ b \ \ b/

\ b correspond à des limites de mots, ce qui semble être ce que vous êtes après?.

Questions connexes