答案 0 :(得分:0)
这是一种没有正则表达式的方法:
set a "one two one three four five one six six seven two one five four"
set unique [list]
foreach element $a {
if {[lsearch -exact $unique $element] == -1} {
lappend unique $element
}
}
puts $unique
或者如果你有Tcl8.5及以上,你可以用以下代码替换循环:
foreach element $a {
if {$element in $unique} {
lappend unique $element
}
}
或者在Tcl8.6及更高版本中更简单,用这一个衬里替换循环:
lmap x $a {if {$x ni $unique} {lappend unique $x}}
如果你不介意单词的顺序,你可以简单地使用内置的lsort
,它不需要任何东西:
set unique [lsort -unique $a]
有了所有这些工具,我认为你不需要正则表达式。
使用正则表达式的一个“简单”替代方法:
while {[regsub -all {\y((\w+)\y.*?)\y\2\y\s*} $a {\1} a] > 0} {continue}
这将取代第二次出现,直到没有更多。
\y
是单词边界(\w
与^
,$
或\W
正则表达式字符之间的匹配)
((\w+)\y.*?)
将匹配并存储一个字词,并且还会存储任何内容,直到该\y\2\y
存储的字词第二次出现。
\s*
删除任何尾随空格。
答案 1 :(得分:-1)