Wyrażenie regularne: szukanie cytatów

Użytkowanie edytora dokumentów
arek
Posty: 50
Rejestracja: wt cze 02, 2009 5:23 pm

Wyrażenie regularne: szukanie cytatów

Post autor: arek »

Nie mogę wymyślić jak napisać wyrażenie regularne by mi znajdowało wszystko co jest między znakami cytatu. Na początek próbowałem coś takiego ".*" ale to mi łączy cytaty.
tzn. Przypuśćmy że mamy taki tekst:
Lorem ipsum dolor sit amet, "consectetur adipiscing" elit. Donec in mauris eu sapien mollis "venenatis ac vitae leo". Curabitur ornare mollis ornare.
To jak dam znajdź wszystkie dostaje coś takiego:
Lorem ipsum dolor sit amet, "consectetur adipiscing" elit. Donec in mauris eu sapien mollis "venenatis ac vitae leo". Curabitur ornare mollis ornare.
A oczekuję:
Lorem ipsum dolor sit amet, "consectetur adipiscing" elit. Donec in mauris eu sapien mollis "venenatis ac vitae leo". Curabitur ornare mollis ornare.
Da się?
Jan_J
Posty: 4621
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Wyażenie regularne: szukanie cytatów

Post autor: Jan_J »

Regex dopasowuje możliwie najszerszy obszar. Szukaj cytatu nie zawierającego "
"[^"]*"
Ja bym jeszcze dołożył wykrywanie porządnych cudzysłowów: “„ przy otwarciu i ” przy zamknięciu
[“„"][^“„”"]*["”]
JJ
LO (25.2|24.8) ∙ Python (3.12|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
arek
Posty: 50
Rejestracja: wt cze 02, 2009 5:23 pm

Re: Wyażenie regularne: szukanie cytatów

Post autor: arek »

Jan_J pisze:Regex dopasowuje możliwie najszerszy obszar. Szukaj cytatu nie zawierającego "
"[^"]*"
Dzięki wielkie. To mi działa.
Jan_J pisze: Ja bym jeszcze dołożył wykrywanie porządnych cudzysłowów: “„ przy otwarciu i ” przy zamknięciu
[“„"][^“„”"]*["”]
Wprawdzie mam tekst, który właśnie nie zawiera cudzysłowów drukarskich. Ale na przyszłość pewnie się przyda.
A jak już jesteśmy przy temacie. Da się jakoś zamienić te "" na te „“ ? Bo przy wstawianiu to mi zamienia.
Jan_J
Posty: 4621
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Wyrażenie regularne: szukanie cytatów

Post autor: Jan_J »

Jeżeli założyć, że wszystkie cudzysłowy typu " są niepożądane, i że odstępy wokół znaków przestankowych są poprawne, to w dwóch etapach:
pierwszy: <spacja>" na <spacja>„
drugi: " na ”

Jeżeli założyć ponadto, że cudzysłowy są poprawnie sparowane, to wystarczy jeden przebieg:
<spacja>"([^"]*)" na <spacja>„$1”

W praktyce oba założenia są zbyt optymistyczne. Warto automatyzować wyszukiwanie kandydatów, ale decyzje o zamianie podejmować samemu.
JJ
LO (25.2|24.8) ∙ Python (3.12|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
zulu144
Posty: 92
Rejestracja: sob gru 12, 2009 3:27 am

Re: Wyrażenie regularne: szukanie cytatów

Post autor: zulu144 »

Jan_J pisze:Jeżeli założyć, że wszystkie cudzysłowy typu " są niepożądane, i że odstępy wokół znaków przestankowych są poprawne, to w dwóch etapach:
pierwszy: <spacja>" na <spacja>„
drugi: " na ”

Jeżeli założyć ponadto, że cudzysłowy są poprawnie sparowane, to wystarczy jeden przebieg:
<spacja>"([^"]*)" na <spacja>„$1”

W praktyce oba założenia są zbyt optymistyczne. Warto automatyzować wyszukiwanie kandydatów, ale decyzje o zamianie podejmować samemu.
Sparowanie trudno sprawdzić (parzystość znaków)
Natomiast usunąć zbędne spacje łatwiej.
Czyli należy zacząć od wyszukiwania pojedynczo <spacja>"<spacja>
i usunięcia niepotrzebnych spacji.
Może nawet lepiej skorzystać z makra poprawiającego interpunkcję komputerową.
Następnie dwa wskazane etapy.
i dodać etapy ze otwarcie cudzysłowu może być na początku akapitu lub po łamaniu wiersza, poprzedzone twardą spacją, kilkoma rodzajami myślników.
Po zamknięciu cudzysłowu mogą być analogiczne znaki.
AOO 4.1.7 na WIN7; LO 6.3.2 portable
ODPOWIEDZ