0

关于 TCL 中的正则表达式,如果我使用以下正则表达式:

regexp "helloworld\[\\s]+.name."

匹配以下输出:

helloworld  (name)

有用。但是我想知道是否需要在“ \”前面添加“ ]”,我看到一些别人的代码,他们没有]用“ ”关闭“ \”,我想知道为什么。

4

3 回答 3

1

一个原因可能是 Utkanos 解释的,另一个可能是由于 Tcl 特定的行为:该[字符在允许命令替换的地方具有特殊含义。观察:

% proc foo {} { return y }
% puts x[foo]z
xyz

因此,当您在 Tcl 中使用正则表达式时(通过尝试按字面意思指定它,或在运行时构造等),您必须考虑形成此正则表达式的字符串将如何被 Tcl 处理。

这就是为什么大多数时候你会看到正则表达式的字符直接传递给regexp使用花括号分组的命令,{并且}:它禁止(大部分)Tcl 的替换,因此允许“按原样”编写正则表达式规范,几乎在它的简单的语法,没有任何转义。

但这显然不适用于您想要动态构建规范的情况(例如,将变量的内容嵌入其中)。通常人们使用双引号对正则表达式字符进行分组,因此需要进行特殊转义以防止某些 Tcl 的替换。更干净的方法可能是使用append命令构造模式。

更多关于分组的信息在这里这里这里

至于在网上找这本书,《精通正则表达式》通常被认为是这方面的书

作为旁注,在您的特定示例中,根本不需要方括号:在正则表达式中,它们用于创建“字符范围” - 匹配指定范围之外的单个字符的模式, - 在您的情况下,范围仅包含一个(元)字符,定义为匹配输入中的单个空白字符。所以在这种特殊情况下,模式helloworld\s+.name.会做得很好。

于 2012-06-26T09:39:31.627 回答
0

不,因为您正在使用[它的特殊含义,即定义一个范围。只有当你想匹配一个文字时,你才会用反斜杠转义它[。反斜杠用于转义字符,否则会在 REGEXP 中调用特殊行为。

(Javascript)

var str = "[hello]";
str.match(/[a-z]+/); //resultant array: ['hello']
str.match(/\[[a-z]+\]/); //resultant array: ['[hello]']
于 2012-06-26T08:56:09.027 回答
0

我相信这个表达是你想要的:

regexp {helloworld\s+.name.} $the_string

您根本不需要任何方括号。

于 2012-06-26T20:29:55.253 回答