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