• 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"

Aruba Cloud - Virtual Private Server VPS
0 głosów
425 wizyt
pytanie zadane 9 marca 2024 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 2024 przez VBService Ekspert (256,600 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 2024 przez BarHorab Nowicjusz (140 p.)
edycja 9 marca 2024 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 2024 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 2024 przez TOWaD Mądrala (6,420 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 2024 przez adrian17 Mentor (352,580 p.)
...moje kondolencje :P
komentarz 13 marca 2024 przez TOWaD Mądrala (6,420 p.)
edycja 18 marca 2024 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 887 wizyt
0 głosów
1 odpowiedź 532 wizyt

93,333 zapytań

142,326 odpowiedzi

322,405 komentarzy

62,669 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...