如何避免匹配此regexp中的最后一个字母?
我有一个关于tcl中regexp的问题:如何避免匹配此regexp中的最后一个字母?,regex,tcl,Regex,Tcl,我有一个关于tcl中regexp的问题: first output: TIP_12.3.4 % second output: TIP_12.3.4 % 有时输出可能如下所示: first output: TIP_12 % second output: TIP_12 % 我想使用以下exgexp获取数字12.3.4或12: output: TIP_(/[0-9].*/[0-9]) 但是为什么它不匹配12.3.4或12%?试试这个: output: TIP_(/([0-9\.^%]*)/[0-
first output: TIP_12.3.4 %
second output: TIP_12.3.4 %
有时输出可能如下所示:
first output: TIP_12 %
second output: TIP_12 %
我想使用以下exgexp获取数字12.3.4或12:
output: TIP_(/[0-9].*/[0-9])
但是为什么它不匹配12.3.4或12%?试试这个:
output: TIP_(/([0-9\.^%]*)/[0-9])
捕获组1
此处演示:
您需要转义圆点,否则它代表“匹配每个字符”。另外,我不确定您的regexp中的斜杠。更好的解决方案:
/TIP_(\d+\.?)+/
以下表达式适用于我:
{TIP_((\d+\.?)+)}
您的问题是,
/
在Tcl的正则表达式语言中一点也不特殊。它只是一个普通的可打印非字母字符。(其他语言有点不同,因为在/
字符中包含正则表达式是很常见的;在Tcl中不是这种情况。)因为它是一个简单的文本,在RE中使用它会使它在输入中预期到它(尽管它不在那里);不出所料,这使得RE不匹配
修复问题:我会使用这样的正则表达式:output:TIP_389;([\d.]+)
,前提是数据的格式合理。这将导致这样的代码:
regexp {output: TIP_([0-9.]+)} $input -> dottedDigits
这里所有不在括号内的内容都是文本,因此代码能够找到要匹配的内容。在括号内(我们为以后保存的位),我们需要一个或多个数字或句点;把它们放在一个方括号里是完美而简单的。净效果是将12.3.4
存储在变量dotteddights
(如果找到)中,并生成一个布尔结果,表明它是否匹配(即,如果条件下,可以将其有效地放在条件下)
NB:正则表达式用大括号括起来,因为方括号也是Tcl语言的元字符;将RE放在大括号中可以避免误解脚本带来的麻烦。(你可以用反斜杠代替,但它们很难看…)