1

我有一个像“aab”这样的随机表达式,我需要从这个表达式中修剪“ab”。有没有办法为此目的使用“string trimright”?(我想要第一个字符“a”)。

4

3 回答 3

3

不,你不能使用string trimright. 正如手册页所说,string trimright删除属于第二个参数的任何尾随字符。因此,如果你这样做

string trimright a.a.b a.b

它从末尾开始a.a.b并删除任何a,.b, 留下空字符串。

要执行您需要的操作,您可以在regsub命令中使用正则表达式:

regsub {a\.b$} a.a.b ""

给你正确的字符串

a.

正则表达式(第一个参数)表示:取一个a字符,后跟一个文字.字符(用反斜杠转义,因为.表示任何字符),然后是b字符串末尾的 a ($)。

这样,您不仅限于aandb字符,还可以使其更通用:

regsub {.\..$} $string ""
于 2012-11-05T09:01:19.203 回答
2

要在末尾删除特定字符串,请不要使用string trimright(它的第二个参数实际上是一个字符集,只是碰巧写成一个字符串)。相反,您应该使用regsub如下代码:

proc removeIfLast {mainString toRemove} {
    set r [string length $toRemove]
    if {$toRemove eq [string range $mainString end-[expr {$r-1}] end]} {
        return [string range $mainString 0 end-$r]
    }
    return $mainString
}

这将执行此操作(来自交互式会话):

% removeIfLast "a.a.b" "a.b"
a.
于 2012-11-05T11:51:58.180 回答
1

如果字符模式始终是“<something> .*<something>...*”,并且如果第一个<something> 是你想要的,那么你最好选择:

lindex [split $input .] 0

这将在句点上拆分输入,然后为您提供第一个元素。

于 2012-11-05T13:52:22.133 回答