0

如何使用正则表达式在 tcl 中搜索反斜杠“\”。我试过以下

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

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

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

2 回答 2

3

当双引号中使用单反斜杠时,它根本没有特殊含义。它应该被逃脱。

% 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
于 2015-10-28T06:57:53.460 回答
1

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

该模式匹配一​​个转义的 dot ,然后是将提取的\.括号表达式(它说:not backslash or dot one or more times ),然后是显式的反斜杠和 dot 。([^\\\.]+)efg[^\\\.]+\\\.

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

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

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


看看Visual REGEXP。我偶尔使用它。

于 2015-10-28T08:56:32.993 回答