ďťż
 
regexp albo cos ďťż
 
regexp albo cos
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

regexp albo cos



Marcin Gryszkalis - 03-01-2006 10:30
Witam
jakos nie moge znalezc prostego rozwiazania na taka zamiane:

przed:
abc def [ghi jkl] [[mno] [pqr]]

po:
abc!def![ghi jkl]![[mno pqr] [stu vwx yz]]

da sie to jednym s///? a jesli nie to? :)
pozdrawiam
--
Marcin Gryszkalis, PGP 0x9F183FA3
jabber jid:mg@chrome.pl, gg:2532994
http://the.fork.pl





=?ISO-8859-2?Q?=A3ukasz_M=B1drzycki?= - 03-01-2006 10:30

  Marcin Gryszkalis napisał(a):
> Witam
> jakos nie moge znalezc prostego rozwiazania na taka zamiane:
> przed:
> abc def [ghi jkl] [[mno] [pqr]]
> po:
> abc!def![ghi jkl]![[mno pqr] [stu vwx yz]]
> da sie to jednym s///? a jesli nie to? :)

ha, dać mi sie udało, ale czy to jest proste?

#+v
while (<DATA>) {
s/(\w*)\s(\w*)\s\[(\w*\s\w*)\]\s\[\[(\w*)\]\s\[(\w*)\]\]/$1!$2![$3]![[$4
$5] [stu vwx yz]]/;
}

__DATA__
abc def [ghi jkl] [[mno] [pqr]]
#-v

pzdr,
luk

--
*- uksza(@)at(@)wp(.)dot(.)pl
*- RLU: #272802 | got slack?




Szymon =?iso-8859-2?Q?Sok=F3=B3?= - 03-01-2006 10:30

  On Mon, 02 Jan 2006 16:51:49 +0100, Marcin Gryszkalis wrote:

> Witam
> jakos nie moge znalezc prostego rozwiazania na taka zamiane:
>
> przed:
> abc def [ghi jkl] [[mno] [pqr]]
>
> po:
> abc!def![ghi jkl]![[mno pqr] [stu vwx yz]]

No banalne przecież:
my $text = 'abc def [ghi jkl] [[mno] [pqr]]';
$text =~ s{\Qabc def [ghi jkl] [[mno] [pqr]]\E}
{abc!def![ghi jkl]![[mno pqr] [stu vwx yz]]};
:->

A poważnie: zamiast dawać przykład, lepiej było opisać, co chcesz osiągnąć.
Wnioskuję (pytanie, czy trafnie), że chcesz zamienić na wykrzykniki
wszystkie te spacje, które nie znajdują się wewnątrz kwadratowych nawiasów.
Być może dałoby się wykombinować jakiś skomplikowany regexp, który to
załatwi za jednym zamachem, ale IMHO prościej zrobić tak:

my $text = 'abc def [ghi jkl] [[mno] [pqr]]';
my $level=0;
sub parser($) {
my ($x) = @_;
return '!' if $x eq ' ' && !$level;
$level++ if $x eq '[';
$level-- if $x eq ']';
return $x;
}
$text =~ s/(.)/&parser($1)/eg;

--
Szymon Sokół (SS316-RIPE) -- Network Manager B
Computer Center, AGH - University of Science and Technology, Cracow, Poland O
http://home.agh.edu.pl/szymon/ PGP key id: RSA: 0x2ABE016B, DSS: 0xF9289982 F
Free speech includes the right not to listen, if not interested -- Heinlein H




Marcin Gryszkalis - 03-01-2006 10:30

  Łukasz Mądrzycki wrote:
> ha, dać mi sie udało, ale czy to jest proste?
>
> #+v
> while (<DATA>) {
> s/(\w*)\s(\w*)\s\[(\w*\s\w*)\]\s\[\[(\w*)\]\s\[(\w*)\]\]/$1!$2![$3]![[$4
> $5] [stu vwx yz]]/;
> }

ano faktycznie nie opisalem precyzyjnie - nawiasy kwadratowe oczywiscie
moga byc zagniezdzone dowolna ilosc razy...

--
Marcin Gryszkalis, PGP 0x9F183FA3
jabber jid:mg@chrome.pl, gg:2532994
http://the.fork.pl





Marcin Gryszkalis - 03-01-2006 10:30

  Szymon Sokół wrote:
> On Mon, 02 Jan 2006 16:51:49 +0100, Marcin Gryszkalis wrote:
>>abc def [ghi jkl] [[mno] [pqr]]
>>abc!def![ghi jkl]![[mno pqr] [stu vwx yz]]

> A poważnie: zamiast dawać przykład, lepiej było opisać, co chcesz osiągnąć.
> Wnioskuję (pytanie, czy trafnie), że chcesz zamienić na wykrzykniki
> wszystkie te spacje, które nie znajdują się wewnątrz kwadratowych nawiasów.
> Być może dałoby się wykombinować jakiś skomplikowany regexp, który to
> załatwi za jednym zamachem, ale IMHO prościej zrobić tak:

dobrze wnioskujesz :)

> my $text = 'abc def [ghi jkl] [[mno] [pqr]]';
> my $level=0;
> sub parser($) {
> my ($x) = @_;
> return '!' if $x eq ' ' && !$level;
> $level++ if $x eq '[';
> $level-- if $x eq ']';
> return $x;
> }
> $text =~ s/(.)/&parser($1)/eg;

Czyli tak jak sie obawiałem, znaczej po znaczku jak w starym dobrym C ;)
Ale z drugiej strony czytelne to jest...

Myslalem naj jakims rekurencyjnym s///eg ale jakos zmeczony za bardzo
jesteman na takie cuda :)

--
Marcin Gryszkalis, PGP 0x9F183FA3
jabber jid:mg@chrome.pl, gg:2532994
http://the.fork.pl




=?ISO-8859-2?Q?Micha=B3_Szafra=F1ski?= - 04-01-2006 09:34

  Marcin Gryszkalis wrote:

> Szymon Sokół wrote:
>
>
>>my $text = 'abc def [ghi jkl] [[mno] [pqr]]';
>>my $level=0;
>>sub parser($) {
>> my ($x) = @_;
>> return '!' if $x eq ' ' && !$level;
>> $level++ if $x eq '[';
>> $level-- if $x eq ']';
>> return $x;
>>}
>>$text =~ s/(.)/&parser($1)/eg;
>
>
> Czyli tak jak sie obawiałem, znaczej po znaczku jak w starym dobrym C ;)
> Ale z drugiej strony czytelne to jest...
>
> Myslalem naj jakims rekurencyjnym s///eg ale jakos zmeczony za bardzo
> jesteman na takie cuda :)
>

Można i tak:

$_ = "abc def [ghi jkl] [[mno] [pqr]]";
$x = qr/\[(??{$x})\](??{$x})|[a-z ]+(??{$x})|/;
s/(\[$x\])| /$1||"!"/ge;

Według mnie jest to również czytelne, ze względu że wyrażenie $x
zawiera wprost opis gramatyki. Mimo to wolę rozwiązanie Szymona bo
(??{}) czasami potrafi wywalić interpreter oraz nie wiem dokładnie
jaką złożność obliczeniową ma taki kod. Przy jawnym parserze jest
oczywiście liniowa. Można go jeszcze trochę przyspieszyć ignorując
nieistotne znaki:

$text =~ s{([\[\]])| } {
if($1) {
$level += $1 eq '['?1:-1;
$1
} else {
$level?" ":"!"
}
}eg;

--
m.




Maciej Misiak - 04-01-2006 09:34

  Marcin Gryszkalis napisał(a):
> Szymon Sokół wrote:
>
>>my $text = 'abc def [ghi jkl] [[mno] [pqr]]';
>>my $level=0;
>>sub parser($) {
>> my ($x) = @_;
>> return '!' if $x eq ' ' && !$level;
>> $level++ if $x eq '[';
>> $level-- if $x eq ']';
>> return $x;
>>}
>>$text =~ s/(.)/&parser($1)/eg;
>
> Czyli tak jak sie obawiałem, znaczej po znaczku jak w starym dobrym C ;)
> Ale z drugiej strony czytelne to jest...
>
> Myslalem naj jakims rekurencyjnym s///eg ale jakos zmeczony za bardzo
> jesteman na takie cuda :)

To ja sobie pozwole w ramach rozruszania mozgu po urlopowym lenistwie:

$_ = 'abc def [ghi jkl] [mno] [pqr]';
$wNawiasie = qr"\[(?:[^\[\]]*|(??{$wNawiasie}))*\]";
print join "!", /[^\[\]\s]+|$wNawiasie/g

Byloby czytelniejsze, gdyby najpierw mozna bylo jakies y/[]/<>/, a na
koniec y/<>/[]/, ale nie wiem czy masz jakies znaczki w zapasie.

grizzley




Robert Szczygiel - 04-01-2006 09:34

  Michał Szafrański wrote:
> Można i tak:
> $_ = "abc def [ghi jkl] [[mno] [pqr]]";
> $x = qr/\[(??{$x})\](??{$x})|[a-z ]+(??{$x})|/;
> s/(\[$x\])| /$1||"!"/ge;

Nieźle. ;) Jak dla mnie jest to mało czytelne, ale jam elektronik. ;)
Proponuję dolożyć do zestawu rozwiązań jeszcze jedno, może mało
efektywne, ale też działa. ;)

s# # $`=~tr/[// - $`=~tr/]// ? ' ' : '!' #ge;

RobTM:)
--
----------------------------- REKLAMA ---------------------------------
---- Mapa Krakowa, ceny paliw w Krakowie: http://www.dobaku.pl --------
---- Radio Taxi 9622 Dwójki: http://taxi.krakow.pl --------------------
---- Masaż leczniczy, relaksacyjny: http://masaz.leczniczy.pl ---------




Maciej Misiak - 04-01-2006 09:34

  Robert Szczygiel napisał(a):
>
> Proponuję dolożyć do zestawu rozwiązań jeszcze jedno, może mało
> efektywne, ale też działa. ;)
>
> s# # $`=~tr/[// - $`=~tr/]// ? ' ' : '!' #ge;

Ech, czlowiek sie meczy, cuda na kiju wymysla, a tu taki przyjdzie,
trzasnie jedno s/// i zadowolony No coz, zycie... :P W takim razie moze
jeszcze modyfikacja zakladajaca, ze po zadnej spacji nie ma trzech
znakow '$'

s# (??{$`=~tr/[// - $`=~tr/]// ? '$$$' : ''})#!#g

grizzley




Piotr Fusik - 07-01-2006 21:08

  > Witam
> jakos nie moge znalezc prostego rozwiazania na taka zamiane:
>
> przed:
> abc def [ghi jkl] [[mno] [pqr]]
>
> po:
> abc!def![ghi jkl]![[mno pqr] [stu vwx yz]]
>
> da sie to jednym s///? a jesli nie to? :)

Mnie zastanawia, z czego wynikają "stu vwx yz" itd.

Jeśli chodzi tylko o zamianę spacji poza nawiasami,
to np. coś takiego:
s/ |(\[)|(])/($L+=!!$1-!!$2or$2)?$&:v33/ge

--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl




=?ISO-8859-2?Q?Micha=B3_Szafra=F1ski?= - 07-01-2006 21:08

  Piotr Fusik wrote:
>>Witam
>>jakos nie moge znalezc prostego rozwiazania na taka zamiane:
>>
>>przed:
>>abc def [ghi jkl] [[mno] [pqr]]
>>
>>po:
>>abc!def![ghi jkl]![[mno pqr] [stu vwx yz]]
>>
>>da sie to jednym s///? a jesli nie to? :)
>
>
> Mnie zastanawia, z czego wynikają "stu vwx yz" itd.
>
> Jeśli chodzi tylko o zamianę spacji poza nawiasami,
> to np. coś takiego:
> s/ |(\[)|(])/($L+=!!$1-!!$2or$2)?$&:v33/ge
>
>

Lub z wersji Roberta:

s#(??{$`=~tr/[//-$`=~tr/]//?"!":$"})#!#g

--
m.




Marcin Gryszkalis - 09-01-2006 10:12

  Michał Szafrański wrote:
>>> przed:
>>> abc def [ghi jkl] [[mno] [pqr]]
>>> po:
>>> abc!def![ghi jkl]![[mno pqr] [stu vwx yz]]

> Piotr Fusik wrote:
>> Mnie zastanawia, z czego wynikają "stu vwx yz" itd.
z niczego, to jest dowolny tekst nie zawierajacy [ i ]

A czy moze szanowni autorzy mogliby dla podniesienia swiadomosci innych
jakos krotko skomentowac rozwiazania?

> s#(??{$`=~tr/[//-$`=~tr/]//?"!":$"})#!#g

rozumiem, ze generujemy tutaj dynamicznie lewa strone s///
$` =~ tr/[// - $` =~ tr/]// ? "!" : $"

no tylko jesli wyrazenie jest ewaluowane zeby sprawdzic czy do czegos
bedzie pasowac, to czym bedzie w tym momencie $`? Czy skoro wyrazenie
jest greedy to pierwsza proba dopasowania wykonuje sie wzgledem calego
stringa? Po czym perl poznaje, ze nasze wyraznie sie dopasowalo czy nie?
no bo sama roznice tr-ow to rozumiem, jesli roznica jest 0 to liczba
otwarc zgadza sie z iloscia zamkniec...
[ufff chociaz tyle zrozumialem ;) ]

>> s/ |(\[)|(])/($L+=!!$1-!!$2or$2)?$&:v33/ge
Tutaj to jakby cos bardziej tradycyjnego czyli kod *po prawej* stronie
s/// :) ale po co to $L? v33? !! to jeszcze pamietam z ktoregos z
golfowych opisow...

pozdrawiam
--
Marcin Gryszkalis, PGP 0x9F183FA3
jabber jid:mg@chrome.pl, gg:2532994
http://the.fork.pl




=?ISO-8859-2?Q?Micha=B3_Szafra=F1ski?= - 11-01-2006 09:16

  Marcin Gryszkalis wrote:
>
>>s#(??{$`=~tr/[//-$`=~tr/]//?"!":$"})#!#g
>
> rozumiem, ze generujemy tutaj dynamicznie lewa strone s///

Nie do końca, bo wyrażenie już jest, tylko puste. A pusty ciąg
pasuje pomiędzy każdymi dwoma znakami oraz na początku i końcu
dopasowywanego tekstu. Dopiero po tym dopasowaniu, za każdym
razem, obliczana jest zawartość (??{}). Można to łatwo sprawdzić
przez:

s#(?{print "$`\n"})##g

> $` =~ tr/[// - $` =~ tr/]// ? "!" : $"
>
> no tylko jesli wyrazenie jest ewaluowane zeby sprawdzic czy do czegos
> bedzie pasowac, to czym bedzie w tym momencie $`? Czy skoro wyrazenie
> jest greedy to pierwsza proba dopasowania wykonuje sie wzgledem calego
> stringa? Po czym perl poznaje, ze nasze wyraznie sie dopasowalo czy nie?
> no bo sama roznice tr-ow to rozumiem, jesli roznica jest 0 to liczba
> otwarc zgadza sie z iloscia zamkniec...
> [ufff chociaz tyle zrozumialem ;) ]
>
>
>>>s/ |(\[)|(])/($L+=!!$1-!!$2or$2)?$&:v33/ge
>
> Tutaj to jakby cos bardziej tradycyjnego czyli kod *po prawej* stronie
> s/// :) ale po co to $L? v33? !! to jeszcze pamietam z ktoregos z
> golfowych opisow...
>
$L to to samo co $level z rozwiązania, które podałem w innej części
wątku. v33 to "!".

--
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    =?ISO-8859-2?Q?eksportuje_z_corela_do_bmp_albo_psd_?==?ISO-8859-2?Q?i_tylko_mi_sie_t=B3o_eksportuje?= Adobe Illustrator - jak w wersji 11 zapisać plik w formacie wersji 10 albo 8? [Postgres] jak zastapic brakujaca funkcje regexp_replace w PG wersji 8.0 [MySQL] REGEXP w FULL-TEXT SEARCH [MySQL] REGEXP =?UTF-8?B?ZG9rxYJhZG5pZSBkd2Egem5ha2k=?= [MySQL] REGEXP - dlaczego nie =?UTF-8?B?ZHppYcWCYQ==?= [oracle] regexp - czemu nie działa? Klatka z filmu DVD/DivX do JPG - jak albo czym? sort + regexp [MySQL] Regexpy
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • marcelq.xlx.pl
  • Cytat

    Decede mihi sole - nie zasłaniaj mi słonca.
    Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści
    Hoc fac - tak czyń.
    A tergo - od tyłu; z tyłu.
    I czarne włosy posiwieją. Safona

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com