TCL正则表达式疑问

时间:2010-07-28 15:32:17

标签: regex tcl

根据我对RE的理解

- > *表示匹配0或更多次出现的正则表达式 - > +表示匹配1个或多个prev regex

现在让我们看看以下示例

FIRST: -

% regexp {:+} "DHCP:Enabled" first
1
% puts $first
:                     --> ":" is stored in variable first
%

SECOND: -

% regexp {:*} "DHCP:Enabled" sec
1
% puts $sec
                     --> Nothing is stored in variable second
%

为什么“:”存储为第一个而不是SECOND?

2 个答案:

答案 0 :(得分:7)

第二个正则表达式{:*}匹配空字符串,因为空字符串是:的0次出现。如果您对-indices使用regexp选项,则会看到它与位置0匹配。

 % regexp -indices :* "DHCP:Enabled" indices
 1
 % puts $indices
 0 -1

换句话说,正则表达式匹配第一个字符并返回。

答案 1 :(得分:0)

它匹配空字符串以便它可以 在“DHCP:Enabled”的开头匹配该空字符串。经常 表达引擎喜欢尽快匹配。为了表明,这是一个互动会议:

% regexp -inline {:*} "DHCP:Enabled"
{}
% regexp -inline -all {:*} "DHCP:Enabled"
{} {} {} {} : {} {} {} {} {} {} {}
% regexp -inline -indices -all {:*} "DHCP:Enabled"
{0 -1} {1 0} {2 1} {3 2} {4 4} {5 4} {6 5} {7 6} {8 7} {9 8} {10 9} {11 10}

-inline选项对于简单测试很有用,-all匹配 每个匹配的位置而不仅仅是第一个,-indices 返回位置而不是字符串。

请注意,只有一次(4 4)的结尾至少与开始时的索引相同;在所有其他情况下,空字符串匹配(并且它是合法的;你说没有匹配任何东西都没问题。)

一般来说,确保您的整体RE与空字符串不匹配是一个非常好的主意,否则您会对结果感到惊讶。