1

Hi I want to match only a part of a variable and store it. For example for the element b12asc34sx110 I want to match b12asc34s and store it in a variable and also store x110 in another variable. The value of the element keep changing, like it can be b12hdh56sx120 or b12hdgwa78x20. The code which I am trying is

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

The value of element will come from the user hence it may change everytim. I am new to regexp hence finding it difficult. I am not getting the output for it. Please help me with this.

4

4 回答 4

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.*$)"
于 2013-07-22T23:21:40.817 回答
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

于 2013-07-23T00:46:44.077 回答
0

如果“x”是一个常数,那么您所要做的就是在 x 处拆分并将第一个值放入一个中,将第二个值放入另一个中 - 无论每一侧发生什么变化,但前提是“x”是恒定的并且会一直出现。要获得 alpha 和 numeric,因为我们没有足够的数据来知道它是否总是在右边是数字的,一个惰性规则就像(*)x(*)应该抓住 x 左边的所有东西(假设它总是存在)和右边的所有东西。

于 2013-07-22T23:07:00.087 回答
0

使用正则表达式,例如regexp {([^x]*)x([0-9]*)} "b12asc23sx110" matched1 sub1 sub2.

于 2013-07-22T22:54:10.033 回答