任何人都能解释一下吗?:正则表达式

时间:2013-09-14 08:43:33

标签: regex tcl

TCL:任何人都能解释一下吗?:正则表达式

我之间感到困惑?和?:。

?表示前面的字符可能存在,也可能不存在。

然后我不明白是什么(?:)表示。

任何人都可以解释一下。

([0-9]+(?:\.[0-9]*)?)

3 个答案:

答案 0 :(得分:15)

假设您尝试在输入字符串中查找ABC123ABC123.45之类的内容,并且希望分别捕获字母和数字。你会使用正则表达式(有点类似于你的),如

([A-Z]+)([0-9]+(\.[0-9]+)?)

上面的正则表达式匹配ABC123.45并提供三个组,代表整个匹配的子部分,并由你放置()括号的位置决定。所以,鉴于我们的正则表达式(不使用?:),我们得到了

Group 1 = ABC
Group 2 = 123.45
Group 3 = .45

现在,总是捕获小数部分可能没什么意义,它实际上已经在我们的第2组中捕获了。那么,您如何使该组()不被捕获?是的,首先使用?:作为

([A-Z]+)([0-9]+(?:\.[0-9]+)?)

现在,您只能获得两个所需的组

Group 1 = ABC
Group 2 = 123.45

注意,我还将正则表达式的最后一部分从\.[0-9]*更改为\.[0-9]+。这样可以防止123.上的匹配,即没有小数部分但仍有点的数字。

答案 1 :(得分:1)

正如Tcl文档的re_syntax手册页中所述,括号内的?:会关闭对该组的捕获。换句话说,表达式(\d)(\d)将匹配2个数字,并使每个数字在单独的匹配组中可用。表达式(\d)(?:\d)类似,但不提供单独匹配组中的匹配项。特别针对tcl:

regexp {(\d)(\d)} $data -> first second

将使命名变量中的第一个数字和第二个数字可用。相应的非收集正则表达式不会提供3个结果,但只有1个来自目标的单个匹配。因此,您的表达式有2个输出,一个用于匹配的所有内容,另一个用于最外面的括号。内括号构成一个正则表达式组,但避免产生另一个匹配的输出。所以你有一些匹配小数(3.1415,0。10)

答案 2 :(得分:0)

?:只是没有创建捕获组。例如,a(?:b)将匹配“abc”中的“ab”