【问题标题】:Need explanation of tcl regexp inline example in the man page please请在手册页中解释 tcl regexp 内联示例
【发布时间】:2014-08-01 00:14:42
【问题描述】:
在尝试了解 regexp 和 --inline 的使用时,看到了这个示例但无法理解它是如何工作的。
手册页的链接是: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}”?有人可以解释一下吗。
感谢您的帮助。
谢谢
【问题讨论】:
标签:
regex
pattern-matching
tcl
inline
【解决方案1】:
如果没有给出-inline 但没有给出-all,regexp 将返回一个列表,该列表包含整个匹配区域的一个值和每个子匹配的一个值(括号捕获的区域)。要查看整个匹配项是什么,请忽略括号:模式现在是 {\w\w},匹配字符串中的前两个单词字符 (in)。如果您跳过一个单词字符(括号外的\w)然后捕获下一个单词字符(括号内的\w),则得到第一个子匹配,得到n。
如果-inline 和-all 都给出,regexp 会重复执行此操作,从最后一个完整匹配后的第一个字符重新开始。
【解决方案2】:
我认为要了解-inline,您必须首先了解-inline 将匹配项(和子匹配项)放在一个列表中。因为如果你有...
regexp -- {\w(\w)} " inlined " m1 m2
你会...
% puts $m1
in
% puts $m2
n
因为整个匹配 in 存储在 m1 中,而捕获组的子匹配 n 存储在 m2 中。
将它们放在一个列表中(即使用-inline 时)将给出{in n}。
当您现在同时拥有-all 和-inline 时(假设您已经知道-all 在正则表达式中检索所有不重叠的匹配项),您不能再在输入字符串后使用变量名,所以你会得到一个包含所有匹配和子匹配的列表,如果我必须将它们命名为 m 和 s(分别用于匹配和子匹配),你有:
in n li i ne e
m s m s m s