基于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
相关产品推荐
相关产品推荐

