Czy da się uprościć tą formułę

Użytkowanie arkusza kalkulacyjnego
KontoLibreOffice
Posty: 92
Rejestracja: wt paź 04, 2022 5:48 pm

Czy da się uprościć tą formułę

Post autor: KontoLibreOffice »

=REGEX(REGEX(D1;"^[:space:]*(yt|YT|Yt|yT)[:digit:]+[:space:]*$";REGEX(D1;"^[:space:]*(yt|YT|Yt|yT)";"YT-"));"[:space:]+";"")

Formuła ma za zadanie zmieniać kody typu YT0501 na YT-0501, spacje początkowe, spacje końcowe jak i wielkość liter nie ma znaczenia. Inne kody np PTYT100 mają pozotać nie zmienione.
7.5.6.2 (X86_64)
Awatar użytkownika
Jermor
Posty: 2325
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Czy da się uprościć tą formułę

Post autor: Jermor »

W jakim kontekście ma ona działać. Komórka zawiera wyłącznie kody, komórka zawiera teksty, wśród których są te kody, Komórka zawiera wiele kodów i tylko te zaczynające się od YT mają być zmienione.
AOO 4.1.15, LO 24.2.5 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Awatar użytkownika
Jermor
Posty: 2325
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Czy da się uprościć tą formułę

Post autor: Jermor »

Tak najbardziej ogólnie, to znaczy może wystąpić ciąg znaków przed i po twoim kodzie, zadziała taka formuła:

Kod: Zaznacz cały

=REGEX(A1;"(.*)\b[Yy][Tt](\d+.*)";"$1YT-$2")
AOO 4.1.15, LO 24.2.5 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
KontoLibreOffice
Posty: 92
Rejestracja: wt paź 04, 2022 5:48 pm

Re: Czy da się uprościć tą formułę

Post autor: KontoLibreOffice »

Co oznacza $1YT-$2?
Dokładniej co oznacza $1ciąg.znaków$2
7.5.6.2 (X86_64)
Jan_J
Posty: 4570
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Czy da się uprościć tą formułę

Post autor: Jan_J »

JJ
LO (24.2|7.6) ∙ Python (3.12|3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Awatar użytkownika
Jermor
Posty: 2325
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Czy da się uprościć tą formułę

Post autor: Jermor »

Te symbole mają takie samo znaczenie jak w operacji "Znajdź i zamień" z wykorzystaniem wyrażeń regularnych. Opisałem to w tym opracowaniu: https://yestok.pl/ooo/y16.php#p8b w części, w której piszę o roli nawiasów okrągłych.
AOO 4.1.15, LO 24.2.5 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Awatar użytkownika
Jermor
Posty: 2325
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Czy da się uprościć tą formułę

Post autor: Jermor »

To jednak i tak nie jest najprostsze wyrażenie. Za wyjątkiem zapisu \d, który oznacza dowolną cyfrę i nie został wymieniony w liście symboli regularnych podanych w helpie, pozostałe są w tym helpie wymienione i można poczytać o ich znaczeniu..
Tych symboli jest jednak więcej i znając je można uprościć twoją formułę do następującej postaci:

Kod: Zaznacz cały

=REGEX(A1;"(?wi)(?:yt)";"YT-")
Przy tym zapisie nawiasy okrągłe nie oznaczają grup przechwytywanych, czyli takich, które można przywołać w innym miejscu.
Pierwszy zapis "(?wi)" mówi, że wyszukiwane będą całe słowa (litera "w") oraz ignorowana będzie wielkość liter (litera "i"). Przez słowa rozumie się ciągi literowocyfrowe ograniczone z obu stron jednym ze znaków: spacja, znakami interpunkcji (kropka, wykrzyknik, myślnik, przecinek, itd), tabulatorami.
Drugi zapis (?:yt) oznacza, że w ciągu tekstowym ma zostać znaleziona grupa liter "yt" będąca jednocześnie początkiem słowa i ewentualna zamiana dotyczy tylko tej grupy. Inne fragmenty tekstu źródłowego pozostają nienaruszone.
No a dalej, że mają zostać zamienione na "YT-".
AOO 4.1.15, LO 24.2.5 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
KontoLibreOffice
Posty: 92
Rejestracja: wt paź 04, 2022 5:48 pm

Re: Czy da się uprościć tą formułę

Post autor: KontoLibreOffice »

Jermor pisze: pt cze 16, 2023 2:27 pm To jednak i tak nie jest najprostsze wyrażenie. Za wyjątkiem zapisu \d, który oznacza dowolną cyfrę i nie został wymieniony w liście symboli regularnych podanych w helpie, pozostałe są w tym helpie wymienione i można poczytać o ich znaczeniu..
Tych symboli jest jednak więcej i znając je można uprościć twoją formułę do następującej postaci:

Kod: Zaznacz cały

=REGEX(A1;"(?wi)(?:yt)";"YT-")
Przy tym zapisie nawiasy okrągłe nie oznaczają grup przechwytywanych, czyli takich, które można przywołać w innym miejscu.
Pierwszy zapis "(?wi)" mówi, że wyszukiwane będą całe słowa (litera "w") oraz ignorowana będzie wielkość liter (litera "i"). Przez słowa rozumie się ciągi literowocyfrowe ograniczone z obu stron jednym ze znaków: spacja, znakami interpunkcji (kropka, wykrzyknik, myślnik, przecinek, itd), tabulatorami.
Drugi zapis (?:yt) oznacza, że w ciągu tekstowym ma zostać znaleziona grupa liter "yt" będąca jednocześnie początkiem słowa i ewentualna zamiana dotyczy tylko tej grupy. Inne fragmenty tekstu źródłowego pozostają nienaruszone.
No a dalej, że mają zostać zamienione na "YT-".
A czy da się w regex zastąpić kilka grup wyrażeń osobnymi zastąpieniami np.
"(^\s*[Yy][Tt]\d+)(\s*$)" ma zostać zastąpione na (YT-)() tj. na Symbole YT- oraz znak pusty
7.5.6.2 (X86_64)
Awatar użytkownika
Jermor
Posty: 2325
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Czy da się uprościć tą formułę

Post autor: Jermor »

Nie bardzo rozumiem to pytanie.
Dlatego napisałem ci już wcześniej, że trzeba znać kontekst żądanego działania.
Po pierwsze nie ma czegoś takiego jak znak pusty. Używamy tego terminu, żeby np. zbadać czy komórka coś zawiera. Wpisując dwa cudzysłowy (A1="") mówimy, że wstawiamy znak pusty, podczas gdy w rzeczywistości niczego nie wstawiamy, sprawdzamy tylko, czy coś jest w A1.
Po drugie nie wiem, co ty robisz z tymi spacjami, bo z wzorca wynika, że szukasz ciągu, którego pierwszym znakiem może być tylko spacja i dowolna liczba dalszych spacji, po których ma się pojawić układ liter YT z dowolną (lecz przynajmniej jedną) liczbą cyfr. Po cyfrach może się pojawić dowolna liczba spacji. Nawiasem mówiąc, ten wzorzec sprawi, że cały dotychczasowy tekst zostanie zastąpiony ciągiem "YT-".
Po trzecie nie wiadomo, o jakie grupy ci chodzi. Może, zamiast prezentować wyrażenie regularne, pokażesz faktyczny tekst, może być udawany, byle odzwierciedlał istotę zagadnienia, co ważne w sposób ogólny, a nie dla jakiegoś jednostkowego przypadku.
Po czwarte, co mi się nasuwa na podstawie tego, co widzę, chodzi ci prawdopodobnie o pozbycie się spacji, poprzedzających i końcowych, ale do tego lepiej użyć zwykłej funkcji Calc, o — niestety nieszczęśliwej — nazwie, USUŃ.ZBĘDNE.ODSTĘPY(). Usuwa ona z ciągu tekstowego wszystkie spacje początkowe i końcowe a wewnątrz ciągu, wszystkie napotkane spacje wielokrotne zamienia na pojedynczą.
AOO 4.1.15, LO 24.2.5 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
KontoLibreOffice
Posty: 92
Rejestracja: wt paź 04, 2022 5:48 pm

Re: Czy da się uprościć tą formułę

Post autor: KontoLibreOffice »

Jermor pisze: pt cze 16, 2023 4:58 pm Nie bardzo rozumiem to pytanie.
Dlatego napisałem ci już wcześniej, że trzeba znać kontekst żądanego działania.
Po pierwsze nie ma czegoś takiego jak znak pusty. Używamy tego terminu, żeby np. zbadać czy komórka coś zawiera. Wpisując dwa cudzysłowy (A1="") mówimy, że wstawiamy znak pusty, podczas gdy w rzeczywistości niczego nie wstawiamy, sprawdzamy tylko, czy coś jest w A1.
Po drugie nie wiem, co ty robisz z tymi spacjami, bo z wzorca wynika, że szukasz ciągu, którego pierwszym znakiem może być tylko spacja i dowolna liczba dalszych spacji, po których ma się pojawić układ liter YT z dowolną (lecz przynajmniej jedną) liczbą cyfr. Po cyfrach może się pojawić dowolna liczba spacji. Nawiasem mówiąc, ten wzorzec sprawi, że cały dotychczasowy tekst zostanie zastąpiony ciągiem "YT-".
Po trzecie nie wiadomo, o jakie grupy ci chodzi. Może, zamiast prezentować wyrażenie regularne, pokażesz faktyczny tekst, może być udawany, byle odzwierciedlał istotę zagadnienia, co ważne w sposób ogólny, a nie dla jakiegoś jednostkowego przypadku.
Po czwarte, co mi się nasuwa na podstawie tego, co widzę, chodzi ci prawdopodobnie o pozbycie się spacji, poprzedzających i końcowych, ale do tego lepiej użyć zwykłej funkcji Calc, o — niestety nieszczęśliwej — nazwie, USUŃ.ZBĘDNE.ODSTĘPY(). Usuwa ona z ciągu tekstowego wszystkie spacje początkowe i końcowe a wewnątrz ciągu, wszystkie napotkane spacje wielokrotne zamienia na pojedynczą.
Przepraszam, że dopiero teraz odpisuję. Pytanie miało cel edukacyjny ponieważ pierwszy regex (w sumie to jest "the" pierwszy ponieważ nigdy wżyciu nie pisałem przed nim regexa)

tj.=REGEX(REGEX(D1;"^[:space:]*(yt|YT|Yt|yT)[:digit:]+[:space:]*$";REGEX(D1;"^[:space:]*(yt|YT|Yt|yT)";"YT-"));"[:space:]+";"")

wykonał zadanie, jednak jest on długi i zagnieżdża funkcje.
Po kilku próbach napisałem zadowalający minie regex który wygląda tak .
=REGEX(D1;"^\s*[Yy][Tt](\d+)\s*$";"YT-$1")
Przedtem napisałem również regex z wykorzystaniem funkcji USUŃ.ZBĘDNE.ODSTĘPY
=REGEX(D1;"^\s*[Yy][Tt]\d+\s*$";USUŃ.ZBĘDNE.ODSTĘPY(REGEX(D1;"[Yy][Tt]";"YT-")))

Regex "=REGEX(A1;"(?wi)(?:yt)";"YT-")" zamienia Kod YT-cyfry na YT--cyfry [dwa myślniki ], taki kod nie byłby potem wyszukany przez wyszukaj.pionowo
[przy wyszukaj.pionowo można też wkleić duplikaty kodów pod spód przeszukiwanej tabeli a potem ctrl+h usunąć myślnik, tak też początkowo zrobiłem jednak ma to swoje wady ]


" Nawiasem mówiąc, ten wzorzec sprawi, że cały dotychczasowy tekst zostanie zastąpiony ciągiem "YT-"."

Tak tu źle postawiłem nawias zamiast (^\s*[Yy][Tt]\d+)(\s*$) miało być (^\s*[Yy][Tt])\d+(\s*$)
w tym przypadku jednak widzę że wystarczy odwrócić nawiasy ^\s*[Yy][Tt](\d+)\s*$
by otrzymać zastąpienie : cośtamjeden$1cośtamdwa.
7.5.6.2 (X86_64)
Awatar użytkownika
Jermor
Posty: 2325
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Czy da się uprościć tą formułę

Post autor: Jermor »

Na swoim małym ekranie nie zauważyłem tego, że powstają dwa myślniki i nie zauważyłem błędu. Powodem jest oczywiście niepoprawne wyrażenie regularne. Powinno wyglądać to tak:

Kod: Zaznacz cały

=REGEX(A1;"(?wi)(?:yt-?)";"YT-")
AOO 4.1.15, LO 24.2.5 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
ODPOWIEDZ