You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Tcl regexp(括号分组)提取前缀与尖括号包裹的属性

Tcl正则提取前缀与尖括号包裹的属性

嘿,这就给你搞定这个Tcl正则的需求!咱们先明确目标:从前缀<属性1><属性2>...格式的字符串里,把前缀和所有属性名都揪出来,而且前缀和每个属性名都不能为空,也不能包含尖括号。

正则表达式写法

咱们用带分组的正则,同时兼顾Tcl的regexp特性:

# 匹配整个字符串的正则(确保完全符合格式)
set full_regex {^([^<>]+)(?:<([^<>]+)>)*$}

# 单独提取属性的正则(如果已经拿到前缀后用)
set attr_regex {<([^<>]+)>}

各部分解释

  • ^([^<>]+):开头的捕获组,匹配所有非尖括号的非空字符,这就是咱们要的前缀。[^<>]排除尖括号,+确保至少有一个字符(前缀非空)。
  • (?:<([^<>]+)>)*:非捕获组包裹属性模式,*表示允许0个或多个属性。里面的([^<>]+)是捕获每个属性名,同样确保非空且不含尖括号。
  • $:锚定字符串结尾,避免匹配不完整的内容。

完整Tcl代码示例

方法1:一次性匹配提取所有内容

set test_str "foo<name><age><user-type>"

if {[set matches [regexp -all -inline $full_regex $test_str]] ne ""} {
    # 提取前缀(第二个元素,第一个是整个匹配串)
    set prefix [lindex $matches 1]
    # 提取所有属性:从第三个元素开始,每个非空值都是属性名
    set attributes [list]
    for {set i 2} {$i < [llength $matches]} {incr i} {
        set attr [lindex $matches $i]
        if {$attr ne ""} {
            lappend attributes $attr
        }
    }

    puts "提取到的前缀: $prefix"
    puts "提取到的属性: $attributes"
} else {
    puts "字符串格式不符合要求!"
}

方法2:先提前缀,再批量提属性

如果不需要严格验证整个字符串格式,也可以拆分步骤:

set test_str "bar<id><value><description>"

# 第一步:提取前缀
if {[regexp {^([^<>]+)} $test_str -> prefix]} {
    puts "前缀: $prefix"
    # 第二步:提取所有属性名
    set attr_matches [regexp -all -inline $attr_regex $test_str]
    # 过滤出捕获的属性名(列表里每隔一个是属性名)
    set attributes [lmap {full attr} $attr_matches {set attr}]
    puts "属性: $attributes"
} else {
    puts "前缀不能为空!"
}

边界情况测试

这两个方法都能处理这些特殊场景:

  • 前缀包含特殊字符:hello_world!@#<attr1><attr2>
  • 只有前缀+一个属性:pizza<large>
  • 前缀带空格:my item<color><size>

内容的提问来源于stack exchange,提问作者umläute

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:09:49