Regex, чтобы получить только символы без пробелов внутри специальных тегов

У меня есть 2 текста в строке:

% Juan%

% Хуан Гонсалес%

И я хочу только получить% Juan%, а не тот, у кого есть Space, я пытался несколько Regexes без везения. В настоящее время я использую:

/%(.*)%/U 

но он получает обе вещи, я пытался добавлять и играть с [^ \ s], но он не работает.

Любая помощь, пожалуйста?

Дело в том, что . соответствует любому символу, но соответствует новой строке. Режим Un Udgredy только делает .* Ленив, и он захватывает текст от % до первого % справа от первого % .

Если ваши строки содержат одну пару %...% , вы можете использовать

 /%(\S+)%/ 

См. Демо-версию regex

Шаблон \S+ соответствует 1 + символам, отличным от пробела, и целому [^\h%] отрицательному символьному классу, который соответствует любому символу, но горизонтальному пространству и символу % .

Если у вас несколько пар %...% , вы можете использовать

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

См. Еще одну демонстрацию regex , где \h соответствует любому горизонтальному пробелу.

Демо-версия PHP :

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

not the one with the Space = не [^ + пространство \s + ] .

Но в нем тоже не может быть % .

Выполняется как %([^\s%]+)%

Но, для дополнительного кредита, вы можете / должны также соответствовать своему пространству
в нем, чтобы обеспечить сбалансированную настройку разделителя.

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

Разъяснения

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