Regex per get solo caratteri senza spazio all'interno di tag speciali

Ho 2 testi in una string:

% Juan%

% Juan Gonzalez%

E voglio solo essere in grado di get% Juan% e non quello con lo Spazio, ho provato diversi Regex senza fortuna. Attualmente utilizzo:

/%(.*)%/U 

ma ottiene entrambe le cose, ho provato ad aggiungere e giocare con [^ \ s] ma non funziona.

Qualche aiuto per favore?

Il problema è questo . corrisponde a qualsiasi carattere ma a una nuova row. La modalità non regolare /U rende solo .* pigro e cattura un text dal % su alla prima % a destra della prima % .

Se le tue stringhe contengono un paio di %...% , puoi usare

 /%(\S+)%/ 

Guarda la demo regex

Il model \S+ corrisponde a 1+ caratteri diversi da uno spazio bianco e all'intera class di caratteri [^\h%] negata che corrisponde a qualsiasi carattere tranne uno spazio orizzontale e un simbolo % .

Se hai più coppie %...% , puoi usare

 /%([^\h%]+)%/ 

Guarda un'altra demo regex , where \h corrisponde a qualsiasi spazio bianco orizzontale.

Demo PHP :

 $re = '/%([^\h%]+)%/'; $str = "%Juan%\n%Juan Gonzalez%"; preg_match_all($re, $str, $matches); print_r($matches[1]); 

not the one with the Space = non [^ + spazio \s + ] in esso.

Ma non può avere nemless un % in esso.

Funziona come %([^\s%]+)%

Ma, per un credito extra, potresti / dovresti anche abbinare quello con lo spazio
in esso per assicurare una configuration bilanciata del delimitatore.

(?:%([^\s%]+)%|%[^%]*%(*SKIP)(*FAIL))

spiegato

  (?: % ( [^\s%]+ ) # (1), Tag you need % | % [^%]* % (*SKIP)(*FAIL) # Consume, but don't match other tags )