-line标志在tcl正则表达式中做了什么?

时间:2015-04-09 07:15:23

标签: regex tcl

下面我复制了我写的代码。我不知道行标志的作用。

set value "hi this is venkat345
hi this is venkat435
hi this is venkat567"

regexp -all -line -- {(venkat.+)$} $value a b  
puts "Full Match: $a"
puts "Sub Match1: $b"

上面的代码给出了以下输出

Full Match: venkat567
Sub Match1: venkat567

任何人都能解释我何时何地应该在tcl正则表达式中选择-line标志

2 个答案:

答案 0 :(得分:2)

我相信man page定义得很好:

  

<强> -line

     

启用换行敏感匹配。默认情况下,换行符是一个完全普通的字符,没有特殊含义。使用此标记时,[^括号表达式和.永远不会匹配换行符,除了正常函数之外,^在任何换行符后匹配空字符串,$匹配空字符串在除了正常功能之外的任何换行之前。此标志等同于指定-linestop-lineanchor,或(?n)嵌入选项(请参阅re_syntax手册页)。

如果您想以另一种方式理解,.[^ ... ]通常会匹配换行符,例如:

regexp -- {^....$} "ab\nc"

返回1(表示正则表达式匹配字符串,将\n计为1个字符)但使用-line开关会阻止.\n匹配

与之相似:

regexp -- {^[^abc]+$} "de\nf"

也会返回1,因为被否定的班级[^abc]能够匹配非abc的字符,其中包含\n

-line开关的第二个功能使^在每个行的开头匹配,而不是仅匹配整个字符串的开头,并使$在每个结尾都匹配而不只是在整个字符串的末尾匹配。

% set text {abc
abc}
abc
abc
% regexp -- {^abc$} $text
0
% regexp -line -- {^abc$} $text
1

至于何时何地,这将取决于你想要做什么。根据您的示例代码,在我看来,您需要获得所有以venkat开头的用户名,这些用户名可以出现在任何行的末尾。由于您希望匹配多个,您需要使用-all-inline开关来获取匹配的字符串,我建议稍微更改正则表达式:

set value "hi this is venkat345
hi this is venkat435
hi this is venkat567"

# I removed the capture group and changed . to \S to match non-space characters
set results [regexp -all -inline -line -- {venkat\S+$} $value]
puts $results
# venkat345 venkat435 venkat567

答案 1 :(得分:1)

-line只需确保您的.永远不会与换行符匹配。

根据Tcl regexp documentation

  

-line

     

启用换行敏感匹配。默认情况下,换行符是   完全普通的人物没有特殊意义。有了这面旗帜,   '[^'括号表达式和'。'永远不会匹配换行符,'^'匹配一个   任何换行符后的空字符串除了正常功能外,还有   除了它之外,'$'在任何换行之前匹配一个空字符串   正常功能。该标志相当于指定-linestop   和-lineanchor,或(?n)嵌入选项(见下面的METASYNTAX)。

以下是没有-line选项的输出:

Full Match: venkat345                                                                                                                                                                                                                                  
hi this is venkat435                                                                                                                                                                                                                                   
hi this is venkat567                                                                                                                                                                                                                                   
Sub Match1: venkat345                                                                                                                                                                                                                                  
hi this is venkat435                                                                                                                                                                                                                                   
hi this is venkat567

.+只匹配value字符串结尾的所有行。