0

我对 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%?

4

4 回答 4

2

您需要转义点,否则它代表“匹配每个字符”。另外,我不确定您的正则表达式中的斜杠。更好的解决方案:

/TIP_(\d+\.?)+/
于 2012-07-06T08:24:21.530 回答
0

试试这个 :

output: TIP_(/([0-9\.^%]*)/[0-9])

捕获组 1。

演示在这里:

http://regexr.com?31f6g

于 2012-07-06T08:12:09.837 回答
0

以下表达式对我有用:

{TIP_((\d+\.?)+)}
于 2012-07-06T13:33:33.747 回答
0

您的问题是,这在 Tcl 的正则表达式语言/一点也不特别。它只是一个普通的可打印非字母字符。(其他语言有点不同,因为在字符中包含正则表达式是很常见的;在 Tcl 中不是这种情况。)因为它是一个简单的文字,在你的 RE 中使用它会使其在输入中期望它(尽管它不在那里);不出所料,这使得 RE 不匹配。/

解决问题:我会使用这样的正则表达式:output: TIP_([\d.]+)假设数据格式合理。这将导致如下代码:

regexp {output: TIP_([0-9.]+)} $input -> dottedDigits

括号中的所有内容都是文字,因此代码能够找到匹配的内容。在括号内(我们稍后保存的位)我们需要一个或多个数字或句点;将它们放在方括号内是完美而简单的。最终效果是将 存储12.3.4在变量中dottedDigits(如果找到)并产生一个布尔结果,说明它是否匹配(即,您可以将其放入一个if有用的条件中)。

注意:正则表达式用大括号括起来,因为方括号也是Tcl 语言元字符;将 RE 放在大括号中可以避免误解脚本的麻烦。(你可以改用反斜杠,但它们很难看……)

于 2012-07-07T07:44:34.350 回答