如何使用正则表达式匹配字符串的一部分

时间:2013-07-22 22:52:01

标签: pattern-matching tcl

嗨我想只匹配变量的一部分并存储它。例如,对于元素 b12asc34sx110 ,我想匹配 b12asc34s 并将其存储在变量中,并将 x110 存储在另一个变量中。元素的值不断变化,如b12hdh56sx120或b12hdgwa78x20。我正在尝试的代码是

set element b12asc34sx110
regexp [\(.*)\ {[^x(0-9]}] $element matched1 
regexp [x(0-9)] $element matched2
puts $matched1
puts $matched2

元素的价值将来自用户因此它可能会改变每个人。 我是regexp的新手,因此很难找到它。我没有得到它的输出。请帮我解决一下这个。

4 个答案:

答案 0 :(得分:1)

你可以这样做:

#!/usr/bin/tclsh

set element "b12asc34sx110"
set pattern "(.*)(x.*$)"

if {[regexp $pattern $element whmatch sub1 sub2]} {
    puts $sub1 
    puts $sub2
}

注意:
如果您的字符串中有多个x,则第二个捕获组将从最后一个x开始,因为第一个量词首先被评估并且是贪婪的(默认行为),因此第一个捕获组包含最大可能的子字符串。
如果您正在寻找最小的第一个子串,请使用此模式(使用惰性量词):

set pattern "(.*?)(x.*$)"

答案 1 :(得分:1)

假设第二部分不能出现“x”:

set element "b12asc34sx110"
if {[set i [string last "x" $element]] >= 0} {
  set head [string range $element 0 $i-1]
  set tail [string range $element $i end]
}

如果“x”可能出现在第二部分但不出现在第一部分中,请将string last更改为string first

答案 2 :(得分:0)

使用像regexp {([^x]*)x([0-9]*)} "b12asc23sx110" matched1 sub1 sub2这样的正则表达式。

答案 3 :(得分:0)

如果“x”是一个常数,那么你所要做的就是在x处拆分并将第一个值放在一个中,将第二个值放在另一个中 - 无论每一方的变化是什么,只有“x” “是一个常数,并将永远出现。要获得字母和数字,因为我们没有足够的数据来知道它是否总是数字在右边,像(*)x(*)这样的惰性规则应该抓住x左边的所有内容(假设它始终存在)并且一切都在右边。