2013-07-22 34 views
1

嗨我想只匹配变量的一部分,并将其存储。例如,对于元素b12asc34sx110我想匹配b12asc34s,并将其存储在一个变量中,并将x110存储在另一个变量中。元素的值不断变化,如可以是b12hdh56sx120或b12hdgwa78x20。我正在尝试的代码是如何使用正则表达式匹配字符串的一部分

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

元素的值将来自用户,因此它可能会改变everytime。 我是新来的正则表达式,因此发现它很困难。我没有得到它的输出。请帮我解决一下这个。

+0

这是什么语言? – abiessu

+1

@abiessu:你可以在标签中看到它是tcl。 –

+0

@CasimiretHippolyte:我现在明白了,谢谢。我期待问题的这一部分直接在问题中指定,但我会在将来观察这些标签。 – abiessu

回答

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.*$)" 
+0

强烈建议使用Tcl将正则表达式放在'{'大括号''''中,以避免无数问题。 –

+0

@DonalFellows:像这样:'set pattern {(。*)(x。* $)}'? –

0

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

+0

如果我正在使用正则表达式(\。* \)[(^ x *)] $ ele匹配 以匹配第一部分,我得到一个错误:Error:unknown command'^ x *'(CMD-005) 如果我做了正则表达式{(\。* \)[(^ x *)]} $ ele匹配它显示不平衡的偏见 – user2533429

+0

我发布的正则表达式是'[^ x] *'(除x以外的所有字符的字符类,用*捕捉尽可能多的),它由'\('和'\)'围绕它,然后是一个文字“x”,接着是[0-9]数字的字符类别,也被设置被捕获。您应该在末尾使用两个匹配变量来捕获结果。考虑到您对解码值的限制,使用拆分的另一个答案也非常好。 – abiessu

+0

我试过** regexp {\([^ x] * \)x \([0-9] * \)} $ ele matched1 matched2 **但是我得到一个0,因为没有字符得到匹配。你有什么建议吗? @abiessu – user2533429

0

如果“x”是一个常量,那么你所要做的就是在x处分割第一个值,并将第一个值放在另一个中 - 不管每边的变化是什么,但只有当“ x“是一个常量,并且会一直出现。为了得到字母和数字,因为我们没有足够的数据知道它是否总是在右边的数字上,像(*)x(*)这样的懒惰规则应该抓住x左边的所有东西(假设这总是存在的)和右边的所有东西。

+0

@CasimiretHippolyte是对的,我的规则是假设除了你给的中间样本外不会出现其他的x,如果出现更多的样本,他会更合适。 –

+0

也许,但由于上下文是未知的,你的方式可能会更好。 –

+0

如果我尝试regexp {\([^ x] * \)x \([0-9] * \)} $ element matched1 matched2输出即将来临0也为正则表达式{\(。* \)x \( 。*))$元素匹配1匹配2结果为零 – user2533429

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