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