aryabatta
aryabatta

Reputation: 21

How to find ',' in a string in TCL

I am new to TCL, just wanted to know that how can we search for "," in a string and want the particular string before and after. Example : tampa,florida

It has to search for , if in that string if there is , it should return tampa and florida we can use string replace but it will not work in my condition because i need to map, tampa and florida to different set of variables dont even know how the inbound would look like to use string range. .

Thanks, Arya

Upvotes: 2

Views: 1737

Answers (3)

wolfhammer
wolfhammer

Reputation: 2661

A variant of slebetman's last answer.

proc before_after {value find {start 0}} {
    set index [string first $find $value $start]
    set left_side [string range $value $start [expr $index - 1]]
    set right_side [string range $value [expr $index + 1] end]
    return [list $left_side $right_side]
}

puts [before_after "tampa,fl" ","]

output:

tampa fl

Upvotes: 0

Peter Lewerin
Peter Lewerin

Reputation: 13252

Unless there is some further condition, you could do it this way:

split tampa,florida ,

This command gives as result a list containing the two strings "tampa" and "florida".

Documentation: split

Upvotes: 4

slebetman
slebetman

Reputation: 113896

The shortest piece of code to do this would be using regular expressions:

if {[regexp {(.+),(.+)} $string a b c]} {
   # $a is the complete match. But we don't care
   # about that so we ignore it

   puts $b; #tampa
   puts $c; #florida
}

The regular expression (.+),(.+) means:

(
  .  any character
  +  one or more of the above
)    save it in a capture group
,    comma character
(
  .  any character
  +  one or more of the above
)    save it in a capture group

See the documentation of regular expression syntax in tcl for more about regular expressions: https://www.tcl.tk/man/tcl8.6/TclCmd/re_syntax.htm


But if you're not familiar with regular expressions and want an alternative way of doing this you can use the various string commands. This is one way to do it:

set comma_location [string first "," $string]
if {$comma_location > -1} {
    set a [string range $string 0 [expr {$comma_location -1}]
    set b [string range $string [expr {$comma_location +1}] end]
    puts $a; #tampa
    puts $b; #florida
}

Upvotes: 3

Related Questions