• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Notepad++ zamiana jednego zbioru znaków na drugi za pomocą spójnika "i"

Object Storage Arubacloud
0 głosów
143 wizyt
pytanie zadane 9 marca w Systemy operacyjne, programy przez BarHorab Nowicjusz (140 p.)
W jaki sposób zamienię np. w programie Notepad++ jeden zbiór liter na inny zbiór robiąc to za jednym razem, to znaczy umieszczając zbiór liter w polu szukany tekst oddzielonych spójnikiem "i" a w polu zamień na zbiór liter na które mają być zamienione te z pierwszego zbioru?

2 odpowiedzi

+1 głos
odpowiedź 9 marca przez VBService Ekspert (253,400 p.)

Notepad++ w oknie Zamień (Replace) pozwala na użycie RegExp-ów, np:

(a)|(b)|(c)   - używamy grupowania

(?1e)(?2f)(?3g) - ?1 oznacza pierwszą grupę przechwytującą, ?2 drugą, itd.

jedno kliknięcie na Zamień wszystkie (Replace All)

komentarz 9 marca przez BarHorab Nowicjusz (140 p.)
edycja 9 marca przez BarHorab
Wielkie dzięki. I nie muszę męczyć się z programowaniem, bo przykładowo w C++ nadal jest masakra z polskimi znakami i mam wrażenie, że mogliby te standardy jakoś w końcu ujednolicić itd.
Swoją drogą to mógłby być elegantszy sposób na dokonywanie takich podmianek żeby można było elementy obydwu zbiorów podawać tylko z oddzielającą je np. spacją, co przy większej liczbie zdefiniowanych zamian byłoby prostsze i bardziej przejrzyste. Acha, a jak wygląda kwestia znaków specjalnych, bo z tego co widzę to można je zamieniać chyba tylko w trybie szukania rozszerzonym?
komentarz 9 marca przez BarHorab Nowicjusz (140 p.)

@VBService, Może napisze jeszcze jedno pytanie w osobnym komentarzu, bo nie wiem czy przeczytałeś mój poprzedni komentarz po jego edycji. Chciałbym jeszcze móc usuwać wszystkie znaki specjalne z tekstu nie robiąc tego z każdym znakiem z osobna, tylko wszystkie na raz. Czy jest taka możliwość, bo nie mogę tego znaleźć w artykułach i specyfikacji wyrażeń regularnych?

0 głosów
odpowiedź 12 marca przez TOWaD Mądrala (6,000 p.)

To nie odpowiedz raczej pomysł. Który u mnie nie działa zgodnie z maksymą

 

"Some people, when confronted with a problem, think "
        "\"I know, I'll use regular expressions.\" "
        "Now they have two problems.";

Pomysł polegał na tym, że uruchamiasz program i podmienia ci wszystkie znaki w katalogu korzystając z flilesystem,  ale zacząłem tylko od main.cpp, czyli zamo podmieniający się plik i niestety nie podmienia znaków. Może ktoś poprawi i będzie działał.

Taki research przed odpowiedzą:

obliczeniowo,to forum 1,to forum 2,setlocale,cpp0x,MZ,regex

jak bym wrócił do odpowiedzi wolnym czasem i poprawił co nie działa.

Edit: A i link do niedziałającego programu

komentarz 12 marca przez adrian17 Ekspert (344,860 p.)
...moje kondolencje :P
komentarz 13 marca przez TOWaD Mądrala (6,000 p.)
edycja 18 marca przez TOWaD

Działa, oprócz mapy i 1,5h życia mniej, a temat nadal do ogarnięcia.

#include <iostream>
#include <fstream>
#include <regex>
#include <unordered_map>
using namespace std;

void setmap(std::unordered_map<string,string> &uml,const char * kodowanie1,std::string kodowanie2) {
    // zakładamy ta samą długość kodu
    for(size_t i=0; i<strlen(kodowanie1)&&i<kodowanie2.size(); i++)
        uml[string(1,kodowanie1[i])]=string(1,kodowanie2[i]);
}
std::string coutstr(const unordered_map<std::string,std::string> & um,const char* fmt){
//std::string s(fmt);
string s="1";
    cout<<s<<endl;
return s;
}
int main() {
    std::unordered_map <string,string>um;
  // ąćęłńóśżźĄĆĘŁŃÓŚŻŹ
    setmap(um,"¹æê³ñ󜿟¥ÆÊ£ÑÓŒ¯","1111111111111");
    
   ifstream f("main.cpp");
    string plik;
    if(f) {
        cout<<"ok";
        getline(f,plik,'\0');
        f.close();
    } else
        cout <<"nok";
    std::regex word_regex("[¹æê³ñ󜿟¥ÆÊ£ÑÓŒ]");
    string jakis ="-";
    try {
    plik=std::regex_replace(plik, word_regex,jakis);}
    catch(...){
        cerr<<"błąd"<<endl;
    }

    cout<<"Za¿ó³æ gêœl¹ jaŸñ"<<endl<<endl; // ¹æê³ñ󜿟¥ÆÊ£ÑÓŒ¯
    cout<<"Podaj jakiœ tekst zwieraj¹cy polskie znaki diakrytyczne: ";
    cout<<"Wciœnij enter, aby zamkn¹æ program...";
   {
        ofstream f("main.cpp");
        if(f) {
            cout<<"ok";
            f<<plik;
            f.close();
        } else
            cout <<"nok";
    }
    cout<<plik<<endl;
    return 0;
}

Edit:: ale się da stackoverflow, więc nie tylko ja miałem z tym problem :p

W sumie to, nie wiem bo nie sprawdzałem. Ale sprawdzałem boost regex działa, ale nie do polskich znaków. I tylko z kompilatorem online https://wandbox.org/#

Na swoje potrzeby wykorzystam to:

plik=std::regex_replace(plik,std::regex("¹"),"ą");
plik=std::regex_replace(plik,std::regex("æ"),"ć");

A i dzięki za natchnienie autorowi pytania, bo końcu będę mógł pozmieniać rozwalającego się C::B po uruchomieniu i będę mógł sprawdzić pisownię VSC i pozamieniać na encje przed końcową kompilacja.

Podobne pytania

0 głosów
3 odpowiedzi 535 wizyt
0 głosów
1 odpowiedź 348 wizyt

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,963 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...