关于 TCL 中的正则表达式,如果我使用以下正则表达式:
regexp "helloworld\[\\s]+.name."
匹配以下输出:
helloworld (name)
有用。但是我想知道是否需要在“ \
”前面添加“ ]
”,我看到一些别人的代码,他们没有]
用“ ”关闭“ \
”,我想知道为什么。
一个原因可能是 Utkanos 解释的,另一个可能是由于 Tcl 特定的行为:该[
字符在允许命令替换的地方具有特殊含义。观察:
% proc foo {} { return y }
% puts x[foo]z
xyz
因此,当您在 Tcl 中使用正则表达式时(通过尝试按字面意思指定它,或在运行时构造等),您必须考虑形成此正则表达式的字符串将如何被 Tcl 处理。
这就是为什么大多数时候你会看到正则表达式的字符直接传递给regexp
使用花括号分组的命令,{
并且}
:它禁止(大部分)Tcl 的替换,因此允许“按原样”编写正则表达式规范,几乎在它的简单的语法,没有任何转义。
但这显然不适用于您想要动态构建规范的情况(例如,将变量的内容嵌入其中)。通常人们使用双引号对正则表达式字符进行分组,因此需要进行特殊转义以防止某些 Tcl 的替换。更干净的方法可能是使用append
命令构造模式。
至于在网上找这本书,《精通正则表达式》通常被认为是这方面的书。
作为旁注,在您的特定示例中,根本不需要方括号:在正则表达式中,它们用于创建“字符范围” - 匹配指定范围之外的单个字符的模式, - 在您的情况下,范围仅包含一个(元)字符,定义为匹配输入中的单个空白字符。所以在这种特殊情况下,模式helloworld\s+.name.
会做得很好。
不,因为您正在使用[
它的特殊含义,即定义一个范围。只有当你想匹配一个文字时,你才会用反斜杠转义它[
。反斜杠用于转义字符,否则会在 REGEXP 中调用特殊行为。
(Javascript)
var str = "[hello]";
str.match(/[a-z]+/); //resultant array: ['hello']
str.match(/\[[a-z]+\]/); //resultant array: ['[hello]']
我相信这个表达是你想要的:
regexp {helloworld\s+.name.} $the_string
您根本不需要任何方括号。