Problem z wyszukiwaniem wyrazów, przy pomocy wyrażeń regularnych


(sexy69bis) #1

przykładowe wyrazy:

asikowie
Asikowierzyn
askowie
Askowierzyn
sikowie
Sikowierzyn
skowie
Skowierzyn

ten wzór: (\b[a-z]+kowie) znajduje
wyrazy zaczynające się z małej litery i zawierające “kowie” w dowolnym miejscu

asikowie
askowie
sikowie
skowie

chciałbym wyszukać wyrazy zaczynające się z dużej litery i zawierające “kowie” w dowolnym miejscu

ten wzór: (\b[A-Z]+kowie) znajduje tylko
wyrazy zawierające “kowie” zaraz po pierwszej dużej literze

Skowierzyn

Jak powinien wyglądać wzór, aby znaleźć również pozostałe wyrazy

Askowierzyn
Sikowierzyn


(Fizyda) #2

Nie w dowolnym miejscu, a na końcu i do tego tylko tuż po jednej literze. Przynajmniej tak masz zapisane w wyrażeniu, dlatego masz problem z szukaniem wyrazów zaczynających się od dużej litery. Jeśli chcesz wyrażenie które szuka wyraz zaczynający się od dużej litery (lub w drugim przypadku małej), a następnie w DOWOLNYM miejscu wyrazu jest kowie to wyrażenie będzie wyglądało mniej więcej tak, ale w środku nie mogą wystąpić wielkie litery:
(\b[a-z]+[a-z]*kowie[a-z]*)
Tutaj masz uwzględnione wszystkie możliwości dla wyrazów zaczynających się od małej litery (jest to warunek konieczny). Następnie mogą wystąpić jakieś małe litery, musi wystąpić ciąg “kowie” i po nim znów mogą wystąpić jakieś małe litery.

Edit:
Twoje wyrażenie które działa przez przypadek, działa tylko dlatego że wyrazy pisane z małej litery mają na końcu ciąg znaków “kowie”, a przed nim stoi jakaś mała literka. Dla wyrazu asikowie Twoje wyrażenie dopasowuje się tylko do części ikowie, jest mała litera, a po niej na końcu wyrazu “kowie”, więc pasuje. Równie dobrze mógłby to być taki ciąg znaków: “Ka12sikowie”


(sexy69bis) #3

Dzięki za pomoc. Trochę to skomplikowane.

to (\b[a-z]+kowie) znajduje również
asikowiecz


(krystian3w) #4

Nie znajduje jak robię podmianę w Notepad++ to zostawi “cz”.

https://regex101.com/r/ecP7cB/1


(sexy69bis) #5

(\b[A-z]+[A-z]kowie[A-z])

to wyszukuje wyrazy zaczynające się na dużą i małą literę

prawidłowy wzór jest: (\b[A-Z]+[a-z]kowie[a-z])


(krystian3w) #6

Jak końcówki nie są ważne i “zyn” może ucinać https://regex101.com/r/ecP7cB/2 :smile:


(sexy69bis) #7

Działa, ale kiepsko wygląda, tylko część wyrazu.
Dobrze by było gdyby zaznaczone było tylko “kowie”


(Fizyda) #8

Ja już się zgubiłem o co chodzi. Zgadując może o to: https://regex101.com/r/BSx4hJ/1?


(sexy69bis) #9

\b[A-Z]+[a-z](kowie)[a-z]

to wszystko jest to samo, nawiasy nic nie wnoszą.
(\b[A-Z]+[a-z]kowie[a-z])

najprostszy jest wzór: i jest OK.
\b[A-Z]+[a-z]*kowie[a-z] *

szkoda, że nie można zaznaczyć tylko "kowie"
Askowierzyniec


(sexy69bis) #10

a jaki będzie wzór, aby wyszukać wyrazy zaczynające się z dużej litery i kończące się na “kowie”

ten
\b[A-Z]*.kowie\b
wyszukuje oprócz
Alkowie
dodatkowo
akowie


(sexy69bis) #11

Już mam:
\b[A-Z]+[a-z]*(kowie)\b


(Fizyda) #12

Wnoszą wnoszą, możesz potem użyć potem konkretnej grupy z wyrażenia do dalszej pracy.


(sexy69bis) #13

a możesz dać przykład z nawiasem, gdzie po usunięciu jego zmieni się poszukiwanie?


(Fizyda) #14

Porównaj wyniki dopasowań dla teoretycznie takich samych wyrażeń:

https://regex101.com/r/BSx4hJ/1
https://regex101.com/r/BSx4hJ/3

EDIT:
W drugim przykładzie był błąd już poprawiłem.


(sexy69bis) #15

([A-Z]+[a-z]), faktycznie, po 2 literach jest “kowie” bez nawiasu ilość liter przed "kowie nie ma znaczenia"
Dzięki.


(Fizyda) #16

Sprawdź jeszcze raz linki bo za pierwszym razem w drugim przykładzie zrobiłem błąd i chyba na tą wersje patrzysz.


(sexy69bis) #17

Teraz oprócz nawiasów nie widzę żadnej różnicy.


(krystian3w) #18

Po prawej można zauważyć że zwiększyła się ilość wykonywanych czynność z 2 do 4.


(sexy69bis) #19

z nawiasami tyle operacji:
Match 1
Full match 20-32 Asikowierzyn
Group 1. 20-23 Asi
Group 2. 23-28 kowie
Group 3. 28-32 rzyn

Match 2
Full match 41-52 Askowierzyn
Group 1. 41-43 As
Group 2. 43-48 kowie
Group 3. 48-52 rzyn

Match 3
Full match 61-72 Sikowierzyn
Group 1. 61-63 Si
Group 2. 63-68 kowie
Group 3. 68-72 rzyn

Match 4
Full match 80-90 Skowierzyn
Group 1. 80-81 S
Group 2. 81-86 kowie
Group 3. 86-90 rzyn

bez nawiasów:
Match 1
Full match 20-32 Asikowierzyn
Group 1. 23-28 kowie

Match 2
Full match 41-52 Askowierzyn
Group 1. 43-48 kowie

Match 3
Full match 61-72 Sikowierzyn
Group 1. 63-68 kowie

Match 4
Full match 80-90 Skowierzyn
Group 1. 81-86 kowie

dużo mniej, to chyba lepiej


(Fizyda) #20

Zależy co robisz i co chcesz uzyskać. Nie znam dokładnej implementacji wyrażeń regularnych, ale to raczej nie są operacje, a dopasowanie do pod-wyrażeń tak by można było skorzystać tylko z wybranego fragmentu w znalezionym ciągu znaków.