2010-05-07 4 views
1

J'ai des adresses dont j'ai besoin pour nettoyer. Une partie du processus est parage suffit indésirables Numéro de maison, par exemple:regex: rogner toutes les chaînes directement précédées de chiffres, sauf si la chaîne appartient à un ensemble prédéfini de chaînes

mainstreet 4a --> mainstreet 4. 

Cependant, je ne veux pas:

618 5th Ave SW --> 618 5 Ave SW 

autrement dit il y a quelques chaînes (pour l'instant: st, nd, rd, th) que je ne veux pas dépouiller. Quelle serait la meilleure méthode pour cela (regex ou autre)?

une regex wokring sans les exceptions serait:

a = a.replaceAll("(^|)([0-9]+)[a-z]+($|)","$1$2$3"); //replace 1a --> 1 

Je pensais à la première recherche et substiting les cas particuliers avec des caractères spéciaux tout en gardant les références dans une carte, puis faites la regex ci-dessus, puis faire le substitut inverse en utilisant la carte de référence, mais je cherche une solution plus simple.

Merci

Répondre

0

Vous pourriez probablement faire avec préanalyse négative:

a = a.replaceAll("(^|)([0-9]+)(?!th|nd|etc)[a-z]+($|)","$1$2$3"); //replace 1a --> 1 

ou tout faire avec préanalyse négative/lookbehind:

a = a.replaceAll("(?<=^|)([0-9]+)(?!th|nd|etc)[a-z]+(?= |$)", "$1"); //replace 1a --> 1 but not 2nd --> 2 
+0

Voulez-vous profiter du premier je pense, bc. Je peux envelopper par la tête autour de lui .. Tout avantage à utiliser ce dernier? En aparté: comment postez-vous avec des exemples de code formatés? –

+0

accepté btw, merci! –

+0

Je suis d'accord, c'est un peu plus facile de lire le premier :-). La seconde me permet d'exprimer juste la partie que vous voulez faire correspondre, et utilise la lookahead/lookbehind/negative-lookahead de largeur nulle pour affirmer d'autres choses à propos de l'endroit où il apparaît, et à quoi elles sont destinées. – Avi

Questions connexes