mIRC Home    About    Download    Register    News    Help

Print Thread
$replaceTok(string,substr,n,token) #268852 09/05/21 01:41 PM
Joined: Jan 2009
Posts: 21
I
Imk0tter Offline OP
Ameglian cow
OP Offline
Ameglian cow
I
Joined: Jan 2009
Posts: 21
Here is an alias that allows you to replace the n'th occurence of the specified substring in the specified string with a token.

IE: $replaceTok(this @ is @ a @ test, @, -1, --) = this @ is @ a -- test

Code
alias replacetok {
  var %pos $pos($1,$2,$iif($3 > 0,$3,$calc($pos($1,$2,0) + $3 + 1)))
  return $+($left($1,$calc(%pos - 1)),$$4,$right($1,- $+ $calc(%pos + $len($2) - 1)))
}


Feel free to fork/optimize the code!

Re: $replaceTok(string,substr,n,token) [Re: Imk0tter] #268853 09/05/21 02:15 PM
Joined: Jan 2009
Posts: 21
I
Imk0tter Offline OP
Ameglian cow
OP Offline
Ameglian cow
I
Joined: Jan 2009
Posts: 21
$replaceTok(this @ is @ a @ test, @, -1, ---,-,-1,^) = this @ is @ a --^test
$replaceTok(this @ is @ a @ test, @, -1, ---,-,-2,^) = this @ is @ a -^- test
$replaceTok(this @ is @ a @ test, @, -1, ---,-,1,^) = this @ is @ a ^-- test
$replaceTok(this @ is @ a @ test, @, -2, ---,-,-2,^) = this @ is -^- a @ test

Code
alias replacetok {
  var %string $1
  var %count 2

  while %count < $0 {

    var %replaceText [ $ $+ [ %count ] ]
    inc %count

    var %max $pos(%string,%replaceText, 0)

    var %token $parseRange([ $ $+ [ %count ] ], %max)
    inc %count


    var %startTok $token(%token,1,32)
    var %endTok $token(%token,2,32) + 1

    var %text [ $ $+ [ %count ] ]
    inc %count

    var %tokensReplaced 0

    while %startTok < %endTok {
      var %pos $pos(%string,%replaceText,$calc(%startTok - %tokensReplaced))
      var %string $+($left(%string,$calc(%pos - 1)),%text,$right(%string,- $+ $calc(%pos + $len(%replaceText) - 1)))

      inc %startTok
      inc %tokensReplaced
    }
  }
  return %string
}



alias -l parserange {
  var %input $1
  var %maxRange $2

  var %startNumber, %endNumber,%c $token(%input,1,45)

  ;if the first character is a -, the first parameter is a negative number; proceed to second - or end of the string
  if ($left(%input,1) == -) {
    var %startNumber $calc(%maxRange - %c + 1)
    var %input $right(%input,-1)
  }
  else {
    var %startNumber %c
  }

  var %a $pos(%input,-,1)

  if %a == $len(%input) {
    ;second - as at end of string (range encountered) no second integer
    %endNumber = %maxRange
  }
  else if !%a {
    ;no - after the first token; no range
    %endNumber = %startNumber
  }
  else {
    ;range encountered; second number present
    ;proceed to first - or end of string, and if there is a positive or negative integer

    var %a $iif($Pos(%input,-,1),$v1,0)
    var %b $iif($pos(%input,-,2),$v1,0)

    var %c $token(%input,2,45)

    if %b > 0 && $calc(%b - %a) == 1 {
      ;second integer is negative,

      var %endNumber $calc(%maxRange - %c + 1)
    }
    else if %b == 0 {
      ;second integer is positive
      var %endnumber %c
    }
    else {
      ;unknown condition
      var %endnumber %c
    }
  }
  return %startNumber %endNumber
}


Last edited by Imk0tter; 09/05/21 04:07 PM.