Portál AbcLinuxu, 14. května 2025 17:08
$promena="Vitejne na mem webu. Jmenuji se F R A N T A a timto Vas zdravim pres internet!";
Jde mi o to aby se vsechny slova,ktera jsou delsi nez 5 pismen i s mezerami( A N D -3pismena,2mezery) predelali na slovo bez mezer :)
$promena="Vitejne na mem webu. Jmenuji se FRANTA a timto Vas zdravim pres internet!";
Nevedel by nekdo jak na to? Uz to zkousim tyden a zadny vysledek. Dik za jakykoliv nakopnuti :)
s/(?:^|\s)(\w\s){5,}/' ' . (join "", (split " ",$&)) . " "/eg
$promena ~= s/(\w) (\w) (\w)/$1$2$3/g #odstrani mezery ze vsech slov co maji 3 pismena
$promena ~= s/(\w) (\w) (\w) (\w)/$1$2$3$4/g #odstrani mezery ze vsech slov co maji 4 pismena
analogicky dale. Slo by to napsat i jednim vyrazem, ale vyzadovalo by to by pokrocilou znalost PCRE a trosku ladeni, takze Vam doporuciji spise dopsat vyrazy v podobnem duchu pro slova do maximalniho poctu pismen. Pokud se tedy nejedna o nejake dlouhodobejsi reseni :) pak se samozrejme vyplani si precist o regulernich vyrazech a dat si tu praci to odladit.
No, ve skutecnosti to neni tak tezke s temu "pokrocilymi znalostmi". Neni ani potreba provadet cachry se splitem, pokud si problem rozdelite na dve casti:
/([A-Z](?: [A-Z]){2,})(?= |$)/
. Vysvetleni:
Prvni vnejsi zavorka je ten nas match (to prostrkane slovo). Zacina na velke pismeno a za tim pokracuje mezera a opet velke pismeno a to cele aspon dvakrat, aby byla splnena podminka peti znaku. Symboly ?:
na zacatku zavorky zajistuji, aby se zavorka neulozila jako $2
atd. Posledni zavorka je positive lookahead assertion, tzn. prvni zavorka se matchuje pouze pokud za ni nasleduje to co je v te druhe, cili dalsi mezera nebo konec retezce (abychom nenasli neco jako A S D Fghj). Nicmene tim ze to je jen assertion tak to tu pripadnou mezeru neukousne, jak by to udelala normalni zavorka ( |$)
.
s/ //g
)Pak uz staci jen tyto dva kroky vhodne zkombinovat.
perl -pe 's/([A-Z](?: [A-Z]){2,})(?= |$)/do {$_ = $1; s, ,,g; $_;}/eg'
(?<!\w)
(?= |$)
) by som nahradil negative ((?!\w)
) ... negative považuje za zhodu aj to, ak reťazec nepokračuje ($, resp ^)
s/((?<!\w)\w(?:\s\w){5,}(?!\w))/../ge
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.