Tcl Tutorial Lesson 18

String comparisons - compare match first last wordend

There are 6 string subcommands that do pattern and string matching. These are relatively fast operations, certainly faster than regular expressions, albeit less powerful.

string compare string1 string2
Compares string1 to string2 and returns a number -1, 0 or 1 based on the comparison. These comparisons are done alphabetically, not numerically - in other words "a" is less than "b", and "10" is less than "2".
  • -1 if string1 is less than string2
  • 0 if string1 is equal to string2
  • 1 if string1 is greater than string2
string first string1 string2
Returns the index of the character in string1 that starts the first match to string2, or -1 if there is no match.
string last string1 string2
Returns the index of the character in string1 that starts the last match to string2, or -1 if there is no match.
string wordend str i
Returns the index of the character just after the last one in the word which contains the i'th character of str. A word is any contiguous set of letters, numbers or underscore characters, or a single other character.
string wordstart str i
Returns the index of the first character in the word that contains the i'th character of str. A word is any contiguous set of letters, numbers or underscore characters, or a single other character.
string match pattern str
Returns 1 if the pattern matches the entire string. The pattern is a glob style pattern.

Example

set fullpath "/usr/home/tcl/TclTutor/Lsn.17"
set relativepath "CVS/Entries"
set directorypath "/usr/bin/"

set paths [list $fullpath $relativepath $directorypath]

foreach path $paths  {
    set first [string first "/" $path]
    set last [string last "/" $path]

    # Report whether path is absolute or relative

    if {$first != 0} {
        puts "$path is a relative path"
    } else {
        puts "$path is an absolute path"
    }

    # If "/" is not the last character in $path, report the
    # last word. Else, remove the last "/", and find the next
    # to last "/", and report the last word.

    incr last
    if {$last != [string length $path]} {
        set name [string range $path $last end]
        puts "The file referenced in $path is $name"
    } else {
        incr last -2;
        set tmp [string range $path 0 $last]
        set last [string last "/" $tmp]
        incr last;
        set name [string range $tmp $last end]
        puts "The final directory in $path is $name"
    }

    # CVS is a directory created by the CVS source code
    # control system.

    if {[string match "*CVS*" $path]} {
        puts "$path is part of the source code control tree"
    }

    # Compare to "a" to determine whether the first char is
    # upper or lower case
    set comparison [string  compare $name "a"]
    if {$comparison >= 0} {
        puts "$name starts with a lowercase letter\n"
    } else {
        puts "$name starts with an uppercase letter\n"
    }
}

  Resulting output

Note: the analysis of the various parts in the path name is just an illustration of string commands. In practice you should use the file command.

/usr/home/tcl/TclTutor/Lsn.17 is an absolute path
The file referenced in /usr/home/tcl/TclTutor/Lsn.17 is Lsn.17
Lsn.17 starts with an uppercase letter

CVS/Entries is a relative path
The file referenced in CVS/Entries is Entries
CVS/Entries is part of the source code control tree
Entries starts with an uppercase letter

/usr/bin/ is an absolute path
The final directory in /usr/bin/ is bin
bin starts with a lowercase letter