Regex 如何检查一系列值中的特定值是否已添加到XML属性?

Regex 如何检查一系列值中的特定值是否已添加到XML属性?,regex,tcl,regex-negation,regex-lookarounds,Regex,Tcl,Regex Negation,Regex Lookarounds,考虑 set data {<prop>red;blue;green</prop>} 如果值为“粉色”,我将以 <prop>red;blue;green;pink</prop> 红色;蓝色绿色粉红色 如果我再运行一次,我会 <prop>red;blue;green;pink;pink</prop> 红色;蓝色绿色粉红色粉红色 是否可以重写正则表达式以检查$value并仅在缺少$value时添加它?而且,它应该能够处理

考虑

set data {<prop>red;blue;green</prop>}
如果值为“粉色”,我将以

<prop>red;blue;green;pink</prop>
红色;蓝色绿色粉红色
如果我再运行一次,我会

<prop>red;blue;green;pink;pink</prop>
红色;蓝色绿色粉红色粉红色
是否可以重写正则表达式以检查$value并仅在缺少$value时添加它?而且,它应该能够处理

<prop>red;blue;pink;green</prop>
红色;蓝色粉红色绿色
我试过((?!$value)),但没有真正起作用。非常感谢您的帮助。

proc addToContent{data color}{
proc addToContent {data color} {
    lassign [split $data <>] -> tag content endtag
    if {$color ni [split $content \;]} {
        return "<$tag>$content;$color<$endtag>"
    } else {
        return $data
    }
}

addToContent {<prop>red;blue;green</prop>} pink
# -> <prop>red;blue;green;pink</prop>
addToContent {<prop>red;blue;pink;green</prop>} pink
# -> <prop>red;blue;pink;green</prop>
lassign[split$data]->标记内容endtag 如果{$color ni[split$content\;]}{ 返回“$content;$color” }否则{ 返回$data } } 添加内容{红色;蓝色;绿色}粉红色 #->红色;蓝色绿色粉红色 添加内容{红色;蓝色;粉红色;绿色}粉红色 #->红色;蓝色粉红色绿色
如果您的Tcl版本没有
lassign
,请使用
foreach{->tag content endtag}[split$data]break
。如果没有
ni
运算符,请使用
[lsearch-exact[split$content\;]$color]<0
。在这两种情况下,您都应该升级

但是对于真正的XML处理,您应该使用类似于
tDOM
的东西

文件:

<prop>red;blue;pink;green</prop>
proc addToContent {data color} {
    lassign [split $data <>] -> tag content endtag
    if {$color ni [split $content \;]} {
        return "<$tag>$content;$color<$endtag>"
    } else {
        return $data
    }
}

addToContent {<prop>red;blue;green</prop>} pink
# -> <prop>red;blue;green;pink</prop>
addToContent {<prop>red;blue;pink;green</prop>} pink
# -> <prop>red;blue;pink;green</prop>