![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Moderatorzy Postów: 36 559 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Mam taki ciąg
Kod START bla bla bla END inneblabla inneblabla Chcę zamienić wszystko między START a END na coś innego, włącznie ze START i END. No to piszemy proste wyrażenie:
W rezultacie otrzymamy: Kod #zamienione# inneblabla inneblabla Proste. Sprawa się komplikuje, gdy pomiędzy START i END włożym podSTART i pod END Kod START bla bla bla START blablaW END bla3 END inneblabla inneblabla W wyniku naszego wyrażenia otrzymamy Kod #zamienione# bla3 END inneblabla inneblabla A powinniśmy otrzymać to samo co w pierwszym przypadku. No to powiecie: zamien .*? na .* i po sprawie. No nie do końca, bo jest jeszcze jeden przypadek, ze START i END pojawi nam się też rownożędnie do pierwszego, czyli np: Kod START bla bla bla START blablaW END bla3 END inneblabla START ccc xxx END inneblabla Zrobie .* da nam Kod #zamienione# inneblabla a mi chodzi, by uzyskac Kod #zamienione# inneblabla START ccc xxx END inneblabla Podsumowując: ma być zamienione tylko pierwsze główne START END, nawet jeśli ma w sobie inne START END, ale nie można już ruszych późniejszych START END Idzie to zrobić wyrażeniem regularnym? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 226 Pomógł: 61 Dołączył: 20.08.2010 Ostrzeżenie: (0%) ![]() ![]() |
@nospor
Twój kod sypnie się, jeśli START END będzie zagnieżdżone więcej niż 2 razy. Jeśli się to nigdy nie zdarzy, to OK, ale jeśli ma to działać w każdych warunkach, to lepiej jest wykorzystać tak zwane "recursive subpatterns". Działa to tak samo jak zwykła rekurencja (?R), tyle że nie wstawia tam całego oryginalnego wyrażenia, tylko n-ty nawias okrągły. A zapis jest taki: (?1), (?2), (?n)
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 8.10.2025 - 07:02 |