WJG (12/12/11) This simple proc arose out of the need to create text line references such as T08n0224_p0425a18(02)-T08n0224_p0425a19(00) in a more compact form, i.e T08n0224_p0425a18(02)-9(00).
#---------------
# Compare str2 to str1 until a mismatch is found. At that point return remainder of str2.
#---------------
# Arguments
# str1 base string
# str2 string to be compared
# Returns
# The difference in string endings.
proc string_diff {str1 str2} {
for {set i 0} {$i < [string length $str1]} {incr i} {
if {[string index $str2 $i] ne [string index $str1 $i]} {
return [string range $str2 $i end]
}
}
return [string range $str2 $i end]
}
WJG (19/06/21) Almost ten years later and I've returned to this issue for a different (sorry about the pun) reason. This time, choose between characters or words.
## Compare 2 strings, return the portion where they differ
# @param[in] opt Set to 'word' to compare word by word, else compare by character.
# @param[in] str1 Comparator String.
# @param[in] str2 The compared string. That is, compare str2 to str1.
# @returns The differences between the two strings.
proc string_diff { opt str1 str2 } {
set div ""
set cmd append
if { $opt == "word" } { set div " " ; set cmd lappend }
set res ""
foreach c1 [split $str1 $div] c2 [split $str2 $div] {
if { $c1 != $c2 } {
$cmd res $c2
}
}
return $res
}