🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.tcl
12 messages
12 total messages Started by koctyxa Mon, 27 Feb 2006 09:45
regexp bez podsłów
#341
Author: koctyxa
Date: Mon, 27 Feb 2006 09:45
16 lines
951 bytes

   Potrzebuję regexpa do zamiany słowa, ale nie podsłowa, czyli

bb -> xx

ale

aabb -> aabb,
bbcc -> bbcc,
aabbcc -> aabbcc.

   Ponoć w perlu wystarczyłoby z przodu i z tyłu wyrażenia zapodać \b.  Jak  
to w tcl-u?

koctyxa
Re: regexp bez podsłów
#340
Author: Googie
Date: Mon, 27 Feb 2006 12:08
26 lines
1291 bytes
koctyxa wrote:
> 
> 
>   Potrzebuję regexpa do zamiany słowa, ale nie podsłowa, czyli
> 
> bb -> xx
> 
> ale
> 
> aabb -> aabb,
> bbcc -> bbcc,
> aabbcc -> aabbcc.
> 
>   Ponoć w perlu wystarczyłoby z przodu i z tyłu wyrażenia zapodać \b.  
> Jak to w tcl-u?
> 
> koctyxa

Może podmieniaj " bb " na " xx " zamiast samo "bb" :) Wtedy będzie 
łatwiej, bo regexp będzie:
\sbb\s


-- 
Pozdrawiam! (Greetings!)
Googie
Re: regexp bez podsłów
#342
Author: koctyxa
Date: Mon, 27 Feb 2006 12:16
9 lines
1029 bytes
> Może podmieniaj " bb " na " xx " zamiast samo "bb" :) Wtedy będzie  
> łatwiej, bo regexp będzie:
> \sbb\s

   Ale to może być np. "(bb)", "bb*cc", "//bb" itp., gdzie te wszystkie  
znaki nie są metaznakami.

koctyxa
Re: regexp bez podsłów
#343
Author: Googie
Date: Mon, 27 Feb 2006 14:49
16 lines
1436 bytes
koctyxa wrote:
> 
>> Może podmieniaj " bb " na " xx " zamiast samo "bb" :) Wtedy będzie 
>> łatwiej, bo regexp będzie:
>> \sbb\s
> 
>   Ale to może być np. "(bb)", "bb*cc", "//bb" itp., gdzie te wszystkie 
> znaki nie są metaznakami.

Nie jestem aż takim guru jeśli chodzi o regexp, ale ja bym to zrobił 
używając [string first], a następnie sprawdzając znaki: przed ([string 
first]-1), oraz po znalezionym wyrazie ([string first]+[string length]+1).

-- 
Pozdrawiam! (Greetings!)
Googie
Re: regexp bez podsłów
#344
Author: koctyxa
Date: Mon, 27 Feb 2006 14:57
8 lines
1046 bytes
>>    Ale to może być np. "(bb)", "bb*cc", "//bb" itp., gdzie te wszystkie  
>> znaki nie są metaznakami.
> [string first]

   Hm..., to by się nadało...

koctyxa
Re: regexp bez podsłów
#345
Author: Wojciech Kocjan
Date: Mon, 27 Feb 2006 17:52
19 lines
1300 bytes
On Mon, 27 Feb 2006 10:45:42 +0100, koctyxa  
<jaq@costam.artemida.amu.edu.pl> wrote:
>    Potrzebuję regexpa do zamiany słowa, ale nie podsłowa, czyli
>
> bb -> xx
>
> ale
>
> aabb -> aabb,
> bbcc -> bbcc,
> aabbcc -> aabbcc.
>
>    Ponoć w perlu wystarczyłoby z przodu i z tyłu wyrażenia zapodać \b.   
> Jak to w tcl-u?

Chyba chodziło o \s - czyli "\\sbb\\s" w tym przypadku :)

-- 
WK
Re: regexp bez podsłów
#346
Author: Googie
Date: Mon, 27 Feb 2006 18:09
11 lines
1265 bytes
Wojciech Kocjan wrote:
> Chyba chodziło o \s - czyli "\\sbb\\s" w tym przypadku :)

Tylko że wtedy zamieni " xx " na "bb" = utnie spacje/taby. Poza tym 
koctyxa napisał że chodzi też o '()', itp. Z tego na ile znam regexpa w 
Tcl, to nie ma takiego operatora, który spełniałby te wymogi, ale moge 
się mylić.

-- 
Pozdrawiam! (Greetings!)
Googie
Re: regexp bez podsłów
#347
Author: Wojciech Kocjan
Date: Mon, 27 Feb 2006 18:20
43 lines
2061 bytes
On Mon, 27 Feb 2006 19:09:36 +0100, Googie <no@spam.org> wrote:

> Wojciech Kocjan wrote:
>> Chyba chodziło o \s - czyli "\\sbb\\s" w tym przypadku :)
>
> Tylko że wtedy zamieni " xx " na "bb" = utnie spacje/taby. Poza tym  
> koctyxa napisał że chodzi też o '()', itp. Z tego na ile znam regexpa w  
> Tcl, to nie ma takiego operatora, który spełniałby te wymogi, ale moge  
> się mylić.

No tak, ale może coś tego typu:

proc escapeRegexp {string} {
     set escape "\[\]\{\}\(\)\\.+-*"
     set rc ""
     foreach char [split $string ""] {
         if {[string first $char $escape] >= 0} {
             append rc \\
         }
         append rc $char
     }
     return $rc
}

set from "xx"
set to "bb"
set text "ala ma xx kota xxy xx"

regsub -all "(^|\\s)[escapeRegexp $from](\\s|\$)" $text "\\1${to}\\2"

Jest też inna możliwość.

set word(xx) bb

set rc ""
foreach {- before word after} [regexp -all -inline \
     "(^|\\s)(\\w*?)(\\s|\$)" $text] {
     catch {set word $replace($word)}
     append rc $before $word $after
}

-- 
WK
Re: regexp bez podsłów
#348
Author: Googie
Date: Mon, 27 Feb 2006 18:38
40 lines
1870 bytes
Wojciech Kocjan wrote:
> No tak, ale może coś tego typu:
> 
> proc escapeRegexp {string} {
>     set escape "\[\]\{\}\(\)\\.+-*"
>     set rc ""
>     foreach char [split $string ""] {
>         if {[string first $char $escape] >= 0} {
>             append rc \\
>         }
>         append rc $char
>     }
>     return $rc
> }
> 
> set from "xx"
> set to "bb"
> set text "ala ma xx kota xxy xx"
> 
> regsub -all "(^|\\s)[escapeRegexp $from](\\s|\$)" $text "\\1${to}\\2"

Nie wiedziałem że tak można :) Fajne.

> Jest też inna możliwość.
> 
> set word(xx) bb
> 
> set rc ""
> foreach {- before word after} [regexp -all -inline \
>     "(^|\\s)(\\w*?)(\\s|\$)" $text] {
>     catch {set word $replace($word)}
>     append rc $before $word $after
> }

Ten zapis mnie rozłożył na łopatki. Gdybym znał to wczesniej... Tyle 
pracy :/

-- 
Pozdrawiam! (Greetings!)
Googie
Re: regexp bez podsłów
#350
Author: Stachu 'Dozzie' K.
Date: Mon, 27 Feb 2006 20:43
22 lines
1322 bytes
On 27.02.2006, koctyxa <jaq@costam.artemida.amu.edu.pl> wrote:
>
>
>    Potrzebuję regexpa do zamiany słowa, ale nie podsłowa, czyli
>
> bb -> xx
>
> ale
>
> aabb -> aabb,
> bbcc -> bbcc,
> aabbcc -> aabbcc.
>
>    Ponoć w perlu wystarczyłoby z przodu i z tyłu wyrażenia zapodać \b.  Jak  
> to w tcl-u?

A co na to mówi `man re_syntax', który można znaleźć w sekcji SEE ALSO
`man regexp'? Mnie powiedział o \< i \>.

-- 
Feel free to correct my English
Stanislaw Klekot
Re: regexp bez podsłów
#351
Author: Stachu 'Dozzie' K.
Date: Mon, 27 Feb 2006 20:55
22 lines
1390 bytes
On 27.02.2006, koctyxa <jaq@costam.artemida.amu.edu.pl> wrote:
>
>
>    Potrzebuję regexpa do zamiany słowa, ale nie podsłowa, czyli
>
> bb -> xx
>
> ale
>
> aabb -> aabb,
> bbcc -> bbcc,
> aabbcc -> aabbcc.
>
>    Ponoć w perlu wystarczyłoby z przodu i z tyłu wyrażenia zapodać \b.  Jak  
> to w tcl-u?

A co na to mówi `man re_syntax', który można znaleźć w sekcji SEE ALSO
`man regexp'? Mnie powiedział o [[:<:]] i [[:>:]].

-- 
Feel free to correct my English
Stanislaw Klekot
Re: regexp bez podsłów
#349
Author: Mirosław Kosmala
Date: Sat, 04 Mar 2006 11:20
23 lines
1620 bytes
Googie wrote:
> 
>> Jest też inna możliwość.
>> 
>> set word(xx) bb
>> 
>> set rc ""
>> foreach {- before word after} [regexp -all -inline \
>>     "(^|\\s)(\\w*?)(\\s|\$)" $text] {
>>     catch {set word $replace($word)}
>>     append rc $before $word $after
>> }
> 
> Ten zapis mnie rozłożył na łopatki. Gdybym znał to wczesniej... Tyle
> pracy :/
> 

   Nie tylko ciebie dobił tą pętelką ;-))))))))


-- 
Miroslaw Kosmala    mail-to:miroslaw.kosmala(|)trilowcy.org
Linux User:#197007  root:$1$ueQ1d75z$NlDhu6oQhfUpmBlnKTDpj0:
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads