如何避免匹配此正则表达式中的最后一个字母?

时间:2012-07-06 08:03:48

标签: 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%?

4 个答案:

答案 0 :(得分:2)

你需要逃避点,否则它代表“匹配每个角色”。另外,我不确定你的正则表达式中的斜杠。更好的解决方案:

/TIP_(\d+\.?)+/

答案 1 :(得分:0)

试试这个:

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

捕获组1。

在这里演示:

http://regexr.com?31f6g

答案 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放在括号中避免了对脚本的错误解释的麻烦。 (你可以使用反斜杠,但它们丑陋 ......)