Regex 这个正则表达式在TCL中试图匹配什么
我是正则表达式的新手,我试图了解以下正则表达式的字符串类型:Regex 这个正则表达式在TCL中试图匹配什么,regex,tcl,Regex,Tcl,我是正则表达式的新手,我试图了解以下正则表达式的字符串类型: set result [regexp "$PersonName\\|\[^\\n]*\\|\[^\\n]*\\|\\s*0x$PersonId\\|\\s*$gender" [split $outPut \n]] 上面的正则表达式试图匹配什么?结果的值是多少?这里的复杂之处在于正则表达式规范受到Tcl字符串插值规则的保护 要确定角度,您应该按照以下思路思考: “$PersonName\\\\\\\[^\\n]*\\\\\\\\\\\
set result [regexp "$PersonName\\|\[^\\n]*\\|\[^\\n]*\\|\\s*0x$PersonId\\|\\s*$gender" [split $outPut \n]]
上面的正则表达式试图匹配什么?结果的值是多少?这里的复杂之处在于正则表达式规范受到Tcl字符串插值规则的保护 要确定角度,您应该按照以下思路思考:
“$PersonName\\\\\\\[^\\n]*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
- 每个反斜杠转义以下字符李>
- 每个
$variable
引用被替换为其值李>
[command…]
替换执行的命令返回的字符串
因此,\\
的每次出现都会在插入的字符串中产生一个“\”字符,\[
的目的是防止Tcl将这些[^\n]
解释为要执行的命令(名为“^\n”)
因此,如果我们假设PersonName
变量包含“Joe”、PersonId
包含DEAD并且gender
包含“male”,那么在对源字符串执行所有替换之后,Tcl将得到Joe\\\\\[^\n]*\\\\\\\\\\s*DEAD\\\\s*male
表示“任何空白字符”\s
将“|”转义,使其失去通常的含义,即引入更改,使其字面上与字符“|”匹配\\\124;
[^\n]*
构造表示“不包括换行符的零个或多个字符的最长序列”。有关详细信息,请阅读正则表达式中的“字符类”result
的值将是正则表达式匹配的次数。如果没有-all
选项,则该值将始终为0或1(即未找到/找到)
总的来说,这个正则表达式(@kostix的答案很好地解释了这一点)但是它确实很难看。REs是一个功能强大的工具,但是你很容易被它们弄糊涂。此外,如果你在新行上拆分输出,那么你不需要在重新匹配时尝试排除它们;在这种情况下,split
的结果中肯定没有新行
如果我们能更好地理解您试图做的事情,我们可以指导您使用更有效的匹配方法(例如,使用带有合适选项的
lsearch
,将数据加载到内存中的SQLite数据库中)。不是答案,但我建议您使用或类似的方法,\s*
意味着“匹配任意数量的空格”.