在尝试理解regexp和--inline use时,看到了这个例子,但无法理解它是如何工作的。
手册页的链接是:http://www.tcl.tk/man/tcl8.4/TclCmd/regexp.htm#M13 在那里,在--inline选项下,给出了这个例子:
regexp -inline -- {\w(\w)} " inlined "
=> {in n}
regexp -all -inline -- {\w(\w)} " inlined "
=> {in n li i ne e}
这是怎样的" {\ w(\ w)}"收益" {in n}"?请有人解释一下。 感谢帮助。
由于
答案 0 :(得分:3)
如果未给出-inline
但未-all
,regexp
将返回一个列表,其中包含匹配的整个区域的一个值和每个子匹配的一个值(括号捕获的区域)。要查看整个匹配是什么,请忽略括号:模式现在为{\w\w}
,匹配字符串中的两个第一个单词字符(in
)。第一个子匹配是你跳过一个单词字符(括号外的\w
)然后捕获下一个单词字符(括号内的\w
)得到的n
。
如果同时给出了-inline
和-all
,regexp
会重复执行此操作,并在上一次完整匹配后的第一个字符处重新启动。
答案 1 :(得分:1)
我认为要理解-inline
,您必须先了解-inline
将匹配(和子匹配)放入列表中。因为如果你有......
regexp -- {\w(\w)} " inlined " m1 m2
你会......
% puts $m1
in
% puts $m2
n
由于整个匹配in
存储在m1
,而捕获组n
的子匹配存储在m2
。
将这些放入列表中(即使用-inline
时)会给{in n}
。
如果您现在同时拥有-all
和-inline
(假设您已经知道-all
检索regexp中的所有非重叠匹配),则无法再使用变量输入字符串后面的名称,所以你得到一个包含所有匹配和子匹配的列表,如果我必须将它们命名为m
和s
(分别用于匹配和子匹配),你有:
in n li i ne e
m s m s m s