8

TCL:任何人都可以解释吗?:在正则表达式中

我在 ? 和 ?: 。

? 表示前面的字符可能出现也可能不出现。

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

任何人都可以请解释一下。

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

3 回答 3

23

假设,你试图在你的输入字符串中寻找类似ABC123或的东西ABC123.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.没有小数部分但仍有点的 ie 数字。

于 2013-09-14T09:00:46.393 回答
2

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

于 2013-09-14T08:46:50.987 回答
2

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

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

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

于 2013-09-14T08:55:16.997 回答