根据我对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?
答案 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与空字符串不匹配是一个非常好的主意,否则您会对结果感到惊讶。