我在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%?
答案 0 :(得分:2)
你需要逃避点,否则它代表“匹配每个角色”。另外,我不确定你的正则表达式中的斜杠。更好的解决方案:
/TIP_(\d+\.?)+/
答案 1 :(得分:0)
答案 2 :(得分:0)
以下表达式适用于我:
{TIP_((\d+\.?)+)}
答案 3 :(得分:0)
您的问题是/
在Tcl的正则表达式语言中并不特别。它只是一个普通的可打印非字母字符。 (其他语言略有不同,因为在/
字符中包含正则表达式是很常见的;在Tcl中不是这种情况。)因为它是一个简单的文字,在RE中使用它会使它期望它在输入中(尽管它不在那里);不出所料,这使RE不匹配。
修复问题:在假设数据格式合理的情况下,我会使用这样的正则表达式:output: TIP_([\d.]+)
。这将导致像这样的代码:
regexp {output: TIP_([0-9.]+)} $input -> dottedDigits
括号中的所有内容都是文字,因此代码可以找到匹配的内容。在括号内(我们稍后保存的位)我们想要一个或多个数字或句点;把它们放在一个正方形的方括号内是完美而简单的。最终效果是将12.3.4
存储在变量dottedDigits
中(如果找到)并生成一个布尔结果,表明它是否匹配(即,您可以将其放入有效的if
条件。)
NB:正则表达式括在括号中,因为方括号也是 Tcl语言元字符;将RE放在括号中避免了对脚本的错误解释的麻烦。 (你可以使用反斜杠,但它们丑陋 ......)