regex/matchtext question

Jim Ault JimAultWins at yahoo.com
Thu Feb 5 07:25:02 EST 2009


Difficulty one is that '[' is a special character in regular expressions and
escaping can make using them even more confusing.  This is also true of the
filter command.

--this function seems to work
--the catch is that the "[" and "]" are special chars
--recall the merge("") function

function getList dertext, derdelimiter, derdelimiter2
  put "<<,>>,{,},[,],{{,}},[[,]]" into oppositeDelm
  if not(derdelimiter is among the items of oppositeDelm)
  then     put "::" into derdelimiter
  if not(derdelimiter2 is among the items of oppositeDelm)
  then    put "::"  into derdelimiter2
  replace cr with numtochar(3) in dertext  --all on one line now
  
  if ( derdelimiter <> derdelimiter2 ) is true then
    replace derdelimiter with (cr & derdelimiter) in dertext
    replace derdelimiter2 with ( derdelimiter2 & cr ) in dertext
    if "]" is in dertext then -- we are using brackets
      replace ( derdelimiter2 & cr ) with ("^^" & cr) in dertext
      filter dertext with ( "*^^" )
      replace "^^" with ( derdelimiter2 ) in dertext  --we are done
    else
      filter dertext with ( "*" & derdelimiter 2 )    --we are done
    end if
  else   --using "::" symetrical double-delimiters
    replace ":" with (":" & cr & ":") in dertext
    replace "::" with empty in dertext
    filter dertext with (":*:")
    replace ":" with "::" in dertext    --we are done
  end if
  return dertext
end getList

Hope this helps.

Jim Ault
Las Vegas

On 2/5/09 2:50 AM, "Klaus Major" <klaus at major-k.de> wrote:

> Hi all,
> 
> I have a nice matchtext script that extract "placeholders" from a text.
> Like everything between "<<" and ">>" or "::" or "{" and "}"
> 
> This is the function I use, it#s a little script of Ken Ray (thanks
> Ken!)
> that I could understand, at least a bit to modify it:-)
> 
> ## extract placeholder tText,tdelimiter,delimiter2
> ## tdelimiter = the delimiter of the returned list of placeholders
> ## derdelimiter2 = the actual "borders" of the placeholders to extract
> function platzhalterextrahieren dertext,derdelimiter,derdelimiter2
> 
>    if derdelimiter = empty then
>      put TAB into derdelimiter
>    end if
>    if derdelimiter2 = empty then
>      put "::" into derdelimiter2
>    end if
> 
>    switch derdelimiter2
>    case "::"
>      put "::" into derdelimiter3
>      break
>    case "<<"
>      put ">>" into derdelimiter3
>      break
>    case "{"
>      put "}" into derdelimiter3
>      break
>    end switch
> 
>    repeat
>      get matchText(dertext,"(?s)" & derdelimiter2 & "(.*?)" &
> derdelimiter3,wert)
>      if it = false then
>        exit repeat
>      end if
>      put derdelimiter2 & wert & derdelimiter3 into neu
>      put neu & derdelimiter after neueliste
>      replace neu with empty in dertext
>    end repeat
> 
>    delete char -1 of neueliste
>    return neueliste
> end platzhalterextrahieren
> 
> This results in a list like:
> ::Anrede_90001::
> ::Titel_90001::
> ::Nachname_90001::
> 
> Or:
> <<Anrede_90001>>
> <<Titel_90001>>
> 
> Or:
> {Anrede_90001}
> {Titel_90001}
> 
> You get the picture.
> 
> Works fine so far, but now I also wanted to use "[" and "]" and even
> "[[" and "]]"
> but I cannot get the script to work. I tried to escape these
> characters like:
> ...
> case "["
>      put "\[" into derdelimiter2
>      put "\]" into derdelimiter3
>      break
> ...
> 
> I need to replace the german decimal delimiter COMMA with a dot before
> I can
> finally MERGE the content of the text, and replace it with a COMMA
> after the MERGE.
> Know what I mean?
> 
> But then I get stuck in an endless repeat loop?!
> 
> Is this possible at all with matchtext?
> Any hints are highly appreciated!
> 
> Thanks a lot in advance!


this is the sample for the test ::variable1:: and it should extract the
::real strings like this:: and jettison the rest with only ::keepers:: left
in a listing





More information about the use-livecode mailing list