2017-10-03 20 views
1

Cela devrait être assez simple, mais je suis incapable de trouver la réponse ni de venir avec elle. J'ai une chaîne qui a toujours un ou plusieurs chiffres à la fin, et potentiellement d'autres chiffres ailleurs. Je veux supprimer tout de la chaîne sauf pour tous les chiffres à la fin.Regex pour remplacer tout sauf les chiffres à la fin

Quelques exemples de cas de test:

"1 test50"    -> "50" 
"anothertest10"   -> "10" 
"can contain spaces123" -> "123" 
"ok1"     -> "1" 

J'ai essayé la chose la plus évidente: str.replaceAll(".*(\\d)+$","$1"), mais malheureusement le .* est adapté en premier lieu, donc pour les cas de test ci-dessus, il se traduira par 0,0,3,1 au lieu de 50,10,123,1. J'ai le sentiment que j'ai besoin d'utiliser un look-behind ou quelque chose, même si je les ai à peine utilisés dans le passé et je ne sais pas comment l'appliquer à mon problème.

+2

'(.? *) (\ D +) $' [Lien] (https: // regex101 .com/r/2pkcev/1) – Gurman

+0

Fondamentalement, vous pouvez faire correspondre les chiffres à la fin de la chaîne avec le modèle [0-9] + $ '. Pourquoi voulez-vous utiliser 'replaceAll'? Edit: vous pouvez également utiliser 'str.replaceFirst (" (? S) (?:. * \\ D)? (\\ d +) $ "," $ 1 ")' pour arriver plus rapidement à la fin de la chaîne sauts de ligne dans la chaîne. Mais est-ce que ça n'a pas l'air lourd? –

+0

@Gurman Merci! 'Str.replaceAll (". *? (\\ d +) $ "," $ 1 ")' travaillé. –

Répondre

1

vous pouvez utiliser la regex

\d+$ 

qui correspondrait à tous les chiffres de suivi, voir le regex101 demo

+1

Je sais que .. mais comment puis-je supprimer tout le reste avec 'replaceAll' .. (Avez-vous lu la description de la question au lieu de simplement le titre? ..) –

+0

Pourquoi voulez-vous utiliser remplacer tout cependant? – marvel308

+0

Personnellement, je pense qu'il est plus facile à lire et plus court qu'un Pattern.compile avec une itération de matcher. Préférence je suppose .. Encore merci pour répondre, mais j'étais déjà au courant de ce que '\\ d + $' fait .. –