Znak konca lini po wyrażeniu regularnym

Witam,
w jaki sposób można w pliku tekstowym po każdym wystąpieniu wyrażenia regularnego znalazł się znak końca linii?

wyrażenie jest postaci: /\W\d\d\d\W/

Witam,

Koniec linii to $ w wyrażeniach regularnych.

chodzi mi raczej aby po /\W\d\d\d\W/ umieścić /n,

ponieważ w jednej linii może wystąpić więcej niż jeden ciąg, który można dopasować do wyrażenia i po każdym trzeba umieścić /n

Metoda, której szukasz to gsub

czyli to powinno być coś w stylu:

File.open(“test.txt”) do |f|
f.gsub(/\W\d\d\d\W/, /\W\d\d\d\W$/)
end

zamiast trzy razy \d daj \d{3}. pewnie można to jeszcze bardziej uprościć. Polecam to do testów http://rubular.com/ i to http://www.addedbytes.com/cheat-sheets/regular-expressions-cheat-sheet/ też się przyda

File.open("test.txt") do |f| f.gsub(/\W\d[3]\W/) { |match| "#{march}\n" } end

nie działa mi i nie wiem czemu…
nie wstawia \n, nawet jak podaje ścieżkę pliku “c:\test.txt”

File.open(“c:\test.txt”) do |f|
f.gsub(/\W\d{3}\W/) { |match| “#{march}\n” }
end

plik zapisuje wykonawczy zapisuje jako test.rb czy to jest dobre rozszerzenie? bo sam już nie wiem…

jest literówka { |match| “#{ march }\n” }

[quote=sevos]File.open("test.txt") do |f| f.gsub(/\W\d[3]\W/) { |match| "#{march}\n" } end
[/quote]
No to nie bardzo ma prawo zadziałać i nie chodzi o literówkę. Jeśli chcesz uzyskać wyniki na ekranie to zrób tak:

File.open("test.txt") do |f| f.each do |line| puts line.gsub(/\W\d[3]\W/) { |match| "#{match}\n" } end end
To może nie da Ci dokładnie tego, co chciałeś uzyskać, ale przybliży chyba do poprawnego rozwiązania.

wyświetla ale nie robi tego co ma robić… :frowning:

Wklej tutaj przykładowy input.

Program powinien działać na czymś takim… po każdym nr telefonu czyli /(\d{3} ){3}/ lub /\d{2} \d{3}( \d{2}){2}/ powinien pojawić koniec linii ale wyświetla się tylko to co było bez zmiany… wyrażenie są poprawne ale coś nie działa z nadpisaniem pliku (pik nie posiada, żadnych ustawień uniemożliwiających edycje) lub też z enterami wpisujący do innego piku tekstowego

H. “DOMEX” DOMINICZAK WOJCIECH 62-200 Gniezno, Jana III Sobieskiego 11a/6 503 047 944 P.U.H. “Maria”
Piotr Błaszkowski Komornik Sądowy Rewiru I Przy Sądzie Rejonowym W Gnieźnie 62-200 Gniezno, Jana III Sobieskiego 20 603 078 754 Poczta Polska - Filia 62-200 Gniezno, Jana III Sobieskiego 20 Poczta Polska - “Twoja Apteka Rodzinna” 62-200 Gniezno, Jana III Sobieskiego 17 61 425 40 26 Polska Grupa Farmaceutyczna S.A. - Apteka Dbam o Zdrowie “Twoja Apteka Rodzinna” 62-200 Gniezno, Jana III Sobieskiego 17 61 426 11 90 Polski Związek Emerytów, Rencistów i Inwalidów - Oddział Rejonowy w Gnieźnie 62-200 Gniezno, Jana III Sobieskiego 20 61 426 32 49 Polski Związek Wędkarski - Koło w Gnieźnie 62-200 Gniezno, Jana III Sobieskiego 20 61 426 37 64 Powiatowy Urząd Pracy w Gnieźnie 62-200 Gniezno, Jana III Sobieskiego 20 PRACOWNIA PROTETYKI STOMATOLOGICZNEJ ‘‘DENTO-MED’’ S.C. 62-200 Gniezno, Jana III Sobieskiego 21 608 519 762 “Prima A’Prillis” Tyloch Jacek 62-200 Gniezno, Jana III Sobieskiego 17 61 426 73 48 PROART - DEKORACJA DOMU

Całość jest mi potrzebna do stworzenia bazy danych firm, do projektu na zaliczenie…

Alert. Ustawa o ochronie danych osobowych. :slight_smile:

Ten kod nie zapisuje Ci do pliku.

[code]old_content = File.read(“plik.txt”)

zamiana

old_content.gsub!(…)

zapis

File.open(“plik.txt”,“w”) { |f| f.write(new_content) }[/code]

@seban ustawa o ochronie danych osobowych nie dotyczy danych firm, ponieważ one są jawne (a te są, z książki telefonicznej) :smiley:

PHONE_REGEX = /\d{3} \d{3} \d{3}|\d{2} \d{3} \d{2} \d{2}/ puts File.read("in.txt").gsub(PHONE_REGEX, "\\0\n")

To żyje… :smiley:

Teraz tylko jeszcze postaram się opracować zapis tego do jakiegoś pliku i będzie dobrze…

[quote=czak]PHONE_REGEX = /\d{3} \d{3} \d{3}|\d{2} \d{3} \d{2} \d{2}/ puts File.read("in.txt").gsub(PHONE_REGEX, "\\0\n")
[/quote]
Tak tylko z ciekawosc zapytam, do czego jest \0 w tym przypadku ? To według RFC ?

koniec = File.open("po.txt","w+") koniec.write(File.read("in.txt").gsub(/\d{3} \d{3} \d{3}\W|\d{2} \d{3} \d{2} \d{2}\W/, "\\0\n") ) koniec.close
To żyje…

Dziękuje wszystkim co pomogli :slight_smile:

Właściwie to jest ‘\0’, tylko escape’nięte żeby wstawić jeszcze \n. \0 to taki “domyślny” capture group obejmujący całe wyrażenie. Nie wiem czy to zgodne z RFC, ale działa :wink: