Už niekoľko hodín som sa snažil získať regexpríkaz, ktorý sa bude zhodovať s neznámym množstvom po sebe idúcich čísel. Verím, že [0-9] * alebo [d] * by malo byť to, čo chcem, keď ja používam Java String.replaceAll pridáva môj náhradný reťazec v miestach, ktoré by nemali zodpovedať regex.
Napríklad: Mám vstupný reťazec typu „Toto je problém my99String“ Ak je náhradný reťazec „~“
Keď to spustím
myString.replaceAll("[\d]*", "~" )
alebo
myString.replaceAll("[0-9]*", "~" )
môj návratový reťazec je "~ T ~ h ~ i ~ s ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ m ~ "
Ako vidíte, čísla boli nahradené, ale prečo je to aj pridanie môj náhradný reťazec medzi znaky.
Chcem, aby to vyzeralo ako "Toto je môj problém so Stringom"
Čo robím zle a prečo je java zodpovedajúce takto.
odpovede:
9 pre odpoveď č. 1\d*
zodpovedá 0 alebo viacerým číslam, a tak sa zhoduje s prázdnym reťazcom. A máte prázdny reťazec pred každým znakom v reťazci. Takže pre každú z nich ju nahradí ~
, preto výsledok.
Skúste použiť \d+
miesto. A nemusíte zahrnúť \d
v triede znakov.
1 pre odpoveď č. 2
[\d]*
zápasy nula alebo viac (ako je definované v. \ t *
). Preto ste "znovu dostať všetky zápasy prostredníctvom svojich reťazcov. Ak používate
[\d]+
ktoré sa zhodujú s 1 alebo viacerými číslami.
z doc:
Greedy quantifiers
X? X, once or not at all
X* X, zero or more times
X+ X, one or more times