使用正则表达式在 tcl 中搜索反斜杠

Search backslach in tcl using regexp

如何使用正则表达式在 tcl 中搜索反斜杠“\”。我尝试关注

regexp {\} "b\a"
regexp {\\} "b\a"

我想搜索“.”之间的文本。和 ”\。”。这该怎么做?例如: abcd.efg\.hij => efg ,为此我尝试了这个:

regexp {\.[a-z]*\.} "abcd.efg\.hij" X

当双引号中使用单反斜杠时,它没有任何特殊意义。应该转义。

% set input "abcd.efg\.hij"; # Check the return value, it does not have backslash in it
abcd.efg.hij
%
% set user "din\esh"; # Check the return value
dinesh
%
% set input "abcd.efg\.hij"; # Escaped the backslash. Check the return value
abcd.efg\.hij
%
% set input {abcd.efg\.hij}; # Or you have to brace the string
abcd.efg\.hij
%

因此,您的正则表达式应更新为,

% regexp "\\" "b\a"
1
% regexp {\} "b\a"
1
% regexp {\} {b\a}
1
% regexp {\} {b\a}
1
%

提取所需数据,

% set input {abcd.efg\.hij}
abcd.efg\.hij
%  regexp {\.(.*)?\} $input ignore match
1
% set match
efg

我会使用 \.([^\\.]+)\\. 但这取决于其他可能的样本。

该模式匹配一​​个转义点 \.,然后是括号表达式 ([^\\.]+),它将提取 efg(它表示:不是 [^ 反斜杠 \ 或点 \. 一次或多次 ]+),然后显式反斜杠 \ 和点 \..

如果您使用捕获括号表达式,您的模式也将起作用。这样的表达式捕获的匹配将被放入第二个变量:

regexp {\.([a-z]*)\.} {abcd.efg\.hij} matchVar subMatchVar

您还必须考虑到解释器会替换双引号字符串 "abcd.efg\.hij" 中的反斜杠 - 最终字符串将变为 abcd.efg.hij,有效地阻止您的模式识别它。所以在这里我使用花括号或者可能使用带有该字符串的变量。


看看Visual REGEXP。偶尔用一下。