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

  • 现在,生成的字符串被传递给RE引擎,该引擎在解析表示正则表达式的字符串时应用其自身的语法规则,如中所述

    根据这些规则,每个反斜杠都会转义以下字符,除非它是一个特殊的“字符输入转义”,因此我们有:

    • \s
      表示“任何空白字符”
    • \\\124;
      将“|”转义,使其失去通常的含义,即引入更改,使其字面上与字符“|”匹配
    [^\n]*
    构造表示“不包括换行符的零个或多个字符的最长序列”。有关详细信息,请阅读正则表达式中的“字符类”


  • result
    的值将是正则表达式匹配的次数。如果没有
    -all
    选项,则该值将始终为0或1(即未找到/找到)

    总的来说,这个正则表达式(@kostix的答案很好地解释了这一点)但是它确实很难看。REs是一个功能强大的工具,但是你很容易被它们弄糊涂。此外,如果你在新行上拆分输出,那么你不需要在重新匹配时尝试排除它们;在这种情况下,
    split
    的结果中肯定没有新行


    如果我们能更好地理解您试图做的事情,我们可以指导您使用更有效的匹配方法(例如,使用带有合适选项的
    lsearch
    ,将数据加载到内存中的SQLite数据库中)。

    不是答案,但我建议您使用或类似的方法,
    \s*
    意味着“匹配任意数量的空格”.