Pytanie o wyrażenie regularne

0

Czy za pomocą wyrażeń regularnych mogę zastąpić masowo w tekście liczby według formuły (n)a -> (n+1)a, gdzie zawartość nawiasu jest liczbą całkowitą, a litera "a" jest literą a?

Mam na myśli coś takiego:

Zawsze, gdy w tekście napotkany zostanie ciąg "liczba z literą a", zastąp liczbę liczbą większą o jeden.

Czyli:

33a jakiś tekst pomiędzy  44a 7a 155a o i znowu jakiś tekścik 3687a 14a 9929561a 317a

Powinno zostać zamienione na:

34a jakiś tekst pomiędzy 45a 8a 156a o i znowu jakiś tekścik 3688a 15a 9929562a 318a

Oczywiście chodzi mi o jeden wzór, który zamieni wszystkie te liczby, a także inne z literą a.

Damy radę?

0

wyrażenia regularne generalnie nie mają w sobie zamieniania, one mogą tylko parsować, albo wyłuskiwać dane

0

Same wyrażenia regularne nie mają możliwości zamiany czegokolwiek. To, czy będziesz mógł to zrobić, zależy od konkretnej implementacji. W php na przykład w prosty sposób można to zrobić czymś w stylu preg_replace, wyrażeniu \d+ z modyfikatorem e i funkcji return \\1+1.

0

No dobra, ale mogę choćby w Notepadzie++ zrobić formułę, która zmieni drugą część tego stringu np:

(\d+)a\s

na

$1b\s

i zamieni mi 376a na 376b .Chciałbym, żeby pierwszą podniosła zawsze o jeden. Już słyszałem, że samym RegExem raczej się nie da, ale aż mi się wierzyć nie chciało, że nikt czegoś takiego do wyrażeń regularnych nie zaimplementował.

PS. Dla mnie wyrażenia regularne, to synonim masowej zamiany ;-)

0

niestety wyrażenie regularne, to synonim szukania ciągu znaków;D

0

W celu zastąpienia, go innym ciągiem znaków ;-)

Kurcze, niech tu wpadnie jakiś cudotwórca i poda jak to zrobić w samym Notepadzie ++ :)

0

Nie sprawdzałem, ale może plugin do Notepad++: RegRexPlace.

Opis napisał(a)

RegRexPlace: a plugin to do "regular regular-expression replaces". Useful when you have often-used regex replacements. I personally use this when writing posts on forums, so I can use my own simplified markup and automatically generated BBCode markup from that. A sample .ini file is included.

0

a czemu potrzebujesz to akurat wyrażeniami regularnymi zrobić?;>

0

Bo jestem leniwy, a wyrażeniami regularnymi byłoby prosto. Z drugiej strony nawet, jeśli wymędzę od kogoś gotowy skrypt, który coś tam zmieni, to nie będę znał zasady, bo raczej będzie zawierał kilka linijek, których nie będę rozumiał - a ja ambitny leń jestem. No i pat ; -)

Przejrzę to rozszerzenie. Ciekawe czemu na starcie wywalam wszystkie rozszerzenia i nawet nie pamiętam, że jest taka możliwość.

0

ja bym napisał kilkulinijkowy (tak może z 10-15 z obsługą plików) programik w javie, który by to zrobił, z wykorzystaniem wyrażeń regularnych ale inkrementację już bez wyrażeń, tak by chyba było najszybciej

0

Java to już w ogóle profesjonalna rzecz ; -)

Planuję nauczyć się pythona tak dla siebie, ale mi się to odracza ;) Coś tam napisałem w Autohotkeyu drobnego na własne potrzeby kilka razy. W sprawie wyrażeń ktoś napisał jak pisać skrypt do tego [z użyciem RegExMatch()] sugerując, że w samym regexie się nie da, ale nie chciało mi się aż wierzyć. Jakby ktoś pisał skrypt, to musiałby być z objaśnieniami łopatologicznymi, bym łyknął zasadę ; -)

W Autohotkeyu do regexu stosuję RegExReplace(). RegExMatch() nie za bardzo rozumiem, do czego może się przydać i w ogóle chyba powierzchownie jarzę tę funkcję. Hm, gdyby chociaż dało się upchnąć w wyrażenie regularne zmienną, to dało by się wpakować formuły matematyczne w regex.

0

match służy właśnie do parsowania, wyrażenie.match(tekst) dostajesz true albo false

wierzyć nie musisz, ale wyrażenia regularne to nie język programowania i wielu rzeczy nie potrafią, chociaż też są fajne;D

myślę, że by się to dało zrobić samymi wyrażeniami, ale na pewno nie jednym:
dla liczb kończących się 0-8 masz 9 wyrażeń zamieniających tą liczbę na kończącą się odpowiednio na 1-9
a dla kończących się na ciąg dziewiątek, zamieniasz ostatnią dziewiątkę na niewystępujący w tekście kod i znowu uruchamiasz wyrażenia na początkowej częsci liczby:

  1. albo w końcu natrafisz na jakąś 0-8 i zamienisz ją na 1-9
  2. albo liczba się skończy i wtedy dodasz 1 na samym początku

i na koniec niepowtarzalnykod zamieniasz na 0

co razem daje całkiem sporo wywołań różnych wyrażeń;D
lepiej to zrobić programem;p

0

Dziś rano niezależnie wpadłem na ten pomysł i też na inny -> na skrypt skryptotwórcę, który wytworzy tysiące potrzebnych formuł po kolei ;)

Niemniej jestem świadom dziadostwa tych metod ;)

Pomyślę jak to zrobić w Autohotkeyu. Szkoda, że nie ma do niego polskiej społeczności, bo to dla amatora jest fajny język.

0

Przykład w Perlu (z Wiki):

$_ = "Magiczna liczba to 150\n";
print;
s/ (\d+)a / $1+a /ex;
print;
0

No tak Perl podobno wymiata, jeśli chodzi o RegEx, ale bardziej przyszłościowy ogólnorozwojowo jest Python (z tego, co kiedyś tu ustaliłem). Skoro mam go zacząć, to chyba to jest dobry moment. Może poproszę kogoś o przetłumaczenie skryptu z AutoHotKeya, którego używam jako szablonu do RegExu do Pythona (najlepiej 3) i wstawienie właśnie tej formułki z dodawaniem, zamiast tej, która zmienia drugą część wyrażenia. Po średnikach są komentarze - 80 % treści ;)

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
#SingleInstance force ;	Polecenie, które w przypadku, ponownego uruchomienia już działającego skryptu zastępuje starą wersję nową.

FileRead, zmienna1, zrodlo.txt ; Polecenie FileRead wczytuje zawartość pliku tekstowego zrodlo.txt znajdującego się w tym samym katalogu, co skrypt do zmiennej zmienna1

zmienna2 := RegExReplace(zmienna1,"(\d+)a", "$1b") ; RegExowe przetwarzanie treści zmiennej zmienna1 według potrzeb zdefiniowanych w cudzysłowach i stworzenie z wyniku przekształceń zmiennej zmienna2. Tu użyłem wzoru przekształcającego drugą część wyrażenia.  

FileAppend, %zmienna2%, efekt.txt, UTF-8 ; FileAppend zapisuje tekst ze zmiennej zmienna2 na końcu pliku efekt.txt w tym samym katalogu, w którym znajduje się plik zrodlo.txt oraz skrypt. Jeśli plik efekt.txt nie istnieje, to zostaje utworzony. Znajdująca się na końcu deklaracja kodowania UTF-8 pozwala zapisać tekst z użyciem Unicode (wymaga użycia forka Autohotkeya - Autohotkey_L) 

1 użytkowników online, w tym zalogowanych: 0, gości: 1