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

Regex, problem z usuwaniem końcówki

VPS Starter Arubacloud
0 głosów
169 wizyt
pytanie zadane 15 czerwca 2018 w PHP przez Grzegorz Mikina Dyskutant (8,060 p.)

[A-Za-ząćęłńóśóźżĄĆĘŁŃÓŚŹŻ_-]*\(+[^M+P+]\) wszystkie słowa oprócz tych w których występuję (MP) chciałbym usunąć. Problem pojawia się w drugiej części. Wiem, że ^ można użyć jako oprócz, niestety wzorzec nie pasuje do nicze

Żabno(MP)

Andrychów(MP) to ma zostać 

=========================================================================

Żnin(KP)

Aleksandrów_Łódzki(ŁD) to powinno zostać usunięte

[A-Za-ząćęłńóśóźżĄĆĘŁŃÓŚŹŻ_-]*+[^M+^P+{2}]

[A-Za-ząćęłńóśóźżĄĆĘŁŃÓŚŹŻ_-]*+[^M+^P+{2}] <<< ten wydaje mi się być najbliższy wpisu, ale może tylko mi się wydawać :) Wiem, że da się to zrobić inaczej, ale staram się robić Regexem i stąd moje pytanie. Pozdrawiam i dziękuję 
komentarz 15 czerwca 2018 przez Grzegorz Mikina Dyskutant (8,060 p.)

regex.pl ostatnie kilka stron jest moje, można zobaczyć 
wklejam tylko część
 

ID Wyrażenie regularne Ciąg znaków Wynik Zwracane ciągi znaków Link
435588 ^MD ( MD ) fałsz   Link
435587 ^MD (MD) fałsz   Link
435586 {^MD} (MD) fałsz   Link
435585 {^MP}+ (MD) fałsz   Link
435584 {^M}+{^P}+ (MD) fałsz   Link
435583 {^MP} (MD) fałsz   Link
435582 {^MP} (MP) fałsz   Link
435581 {MP} (MP) prawda
  1. MP
Link
435580 [/(M]+[/)P] (MP) fałsz   Link
435579 [/(M][/)P] (MP) fałsz   Link
435578 [A-Za-ząćęłńóśóźżĄĆĘŁŃÓŚŹŻ_-]*[/(M[]/)P] Alwernia(MP) fałsz   Link
435577 [A-Za-ząćęłńóśóźżĄĆĘŁŃÓŚŹŻ_-]*[/(M[/)P] Alwernia(MP) fałsz   Link
435576 [A-Za-ząćęłńóśóźżĄĆĘŁŃÓŚŹŻ_-]*[/(M]+[/)P] Alwernia(MP) fałsz   Link
435575 [A-Za-ząćęłńóśóźżĄĆĘŁŃÓŚŹŻ_-]*^(MP)+ Alwernia(MP) fałsz   Link
435574 [A-Za-ząćęłńóśóźżĄĆĘŁŃÓŚŹŻ_-]*+^(MP)+ Alwernia(MP) fałsz   Link
435573 [A-Za-ząćęłńóśóźżĄĆĘŁŃÓŚŹŻ_-]*+^(MP)+ Alwernia(MD) fałsz   Link
435572 [A-Za-ząćęłńóśóźżĄĆĘŁŃÓŚŹŻ_-]*+[^(MP)] Alwernia(MD) fałsz   Link
435571 [A-Za-ząćęłńóśóźżĄĆĘŁŃÓŚŹŻ_-]*+[^(MP)] Alwernia(MP) fałsz

2 odpowiedzi

+1 głos
odpowiedź 15 czerwca 2018 przez Tomek Sochacki Ekspert (227,510 p.)
wybrane 16 czerwca 2018 przez Grzegorz Mikina
 
Najlepsza

Pytanie jak dostajesz te ciągi znakowe, czy jest to jeden duży ciąg czy osobne (np. lecisz iteracyjne po tablicy ciągów). Jeśli analizujesz każdy kolejny ciąg i chcesz dla niego dostać true/false to może coś takiego:

const reg = /^(?=.*\(MP\)).+$/i;

true: ciąg zostaje (zawiera MP)
false: ciąg do usunięcia (nie zawiera MP)

reg.test('Żabno(MP)');              //true
reg.test('Andrychów(MP)');          //true
reg.test('Żnin(KP)');               //false
reg.test('Aleksandrów_Łódzki(ŁD)'); //false

 

Generalnie w tym przypadku nie skupiam się na znakach z jakich składa się ciąg tylko sprawdzam, czy gdzieś w ciągu znajduje się (MP) lub (mp) (flaga "i") i jeśli tak to traktuję go jako prawidłowy (true).

O coś takiego chodzi?

Pisałem w JS bo w PHP na co dzień nie siedzę ale myślę, że łatwo sobie przerobisz funkcje - w JS metoda test() sprawdza, czy ciąg znakowy pasuje do podanego wzorcami jeśli tak to zwraca true.

Edit:

Tak sobie też myślę, że jeśli analizujesz kolejno te ciągi to w sumie wystarczy proste String.prototype.includes tylko że wtedy ważna jest wielkość znaków.

komentarz 15 czerwca 2018 przez Grzegorz Mikina Dyskutant (8,060 p.)

Elegancko to zrobione, tylko chodzi o to żeby zostawiał właśnie te MP, bo tylko do tego nie mogłem dojść dlaczego ta końcówka jest zła? [^MP+]{2}
Co to jest i do czego służy ta flaga? 

komentarz 15 czerwca 2018 przez Tomek Sochacki Ekspert (227,510 p.)
edycja 15 czerwca 2018 przez Tomek Sochacki
Czyli chodzi Ci o to, żeby np.

ciąg Żnin(MP) zamienił na samo (MP)

a ciąg

Żnin(KK) całkowicie usunął i zamienił na "" ?

 

albo inaczej, dla tych 4 przykładów na których pracujemy napisz co oczekujesz, że funkcja obrabiająca je zwróci jako wynik.
komentarz 15 czerwca 2018 przez Tomek Sochacki Ekspert (227,510 p.)
[^MP+]{2}

ten zapis oznacza "wyszukaj dowolne znaki za wyjątkiem "M", "P" lub znaku "+" i dopasuj dokładnie dwa takie dowolne znaki: {2}

komentarz 16 czerwca 2018 przez Grzegorz Mikina Dyskutant (8,060 p.)
A nie przypadkiem za wyjątkiem MP który występuję zero lub jeden raz maksymalnie? Bo wcześniej dawałem M+P+
0 głosów
odpowiedź 16 czerwca 2018 przez Grzegorz Mikina Dyskutant (8,060 p.)
Nie, tzn wiem już jak to zrobić dzięki twojej pomocy ale zapewne da się to znacząco skrócić. Chodzi o to żeby cała linijka i tylko ta linijka w której występuje to MP została a linijki w których występuję coś innego zniknęły.

Podobne pytania

0 głosów
2 odpowiedzi 745 wizyt
0 głosów
1 odpowiedź 382 wizyt
pytanie zadane 31 października 2016 w Systemy operacyjne, programy przez Patryk Bieganski Nowicjusz (180 p.)

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...