下面我复制了我写的代码。我不知道行标志的作用。
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标志
答案 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
只需确保您的.
永远不会与换行符匹配。
-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
字符串结尾的所有行。