【问题标题】: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 但没有给出-allregexp 将返回一个列表,该列表包含整个匹配区域的一个值和每个子匹配的一个值(括号捕获的区域)。要查看整个匹配项是什么,请忽略括号:模式现在是 {\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 在正则表达式中检索所有不重叠的匹配项),您不能再在输入字符串后使用变量名,所以你会得到一个包含所有匹配和子匹配的列表,如果我必须将它们命名为 ms(分别用于匹配和子匹配),你有:

    in n  li i  ne e
    m  s  m  s  m  s
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-07
      相关资源
      最近更新 更多