如何使用TCL中的正则表达式删除字符串中重复的单词?

时间:2015-03-19 07:14:34

标签: regex

设置“一二二三四有五六六七二五一四”。我想从使用正则表达式中删除重复的元素。我试过了 。但没用。

2 个答案:

答案 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

codepad demo

或者如果你有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)

(\S+)(?=.*\b\1\b)

你可以使用这个简单的正则表达式。取代empty string。参见演示。

https://regex101.com/r/pT4tM5/16