Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Tcl中需要的正则表达式_Regex_Tcl - Fatal编程技术网

Regex Tcl中需要的正则表达式

Regex Tcl中需要的正则表达式,regex,tcl,Regex,Tcl,我想提取 “内存:(71%)”来自下面提到的字符串。此(71%)每次都会更改 字符串:“内存:327127123k。总计,2334437k已使用(71%),9345624 k空闲(29%),1123k缓冲区” 到目前为止,我已经制作了这个正则表达式,但它选择了整行 {[ regexp { Memory: (.*%)} 首先,您必须转义正则表达式中的(),使其与该字符匹配,因此: {[ regexp { Memory: \(.*%\)} 这将匹配类似于的字符串 "Memory: (71%)"

我想提取

“内存:(71%)”
来自下面提到的字符串。此
(71%)
每次都会更改

字符串:
“内存:327127123k。总计,2334437k已使用(71%),9345624 k空闲(29%),1123k缓冲区”

到目前为止,我已经制作了这个正则表达式,但它选择了整行

{[ regexp { Memory: (.*%)}

首先,您必须转义正则表达式中的
),使其与该字符匹配,因此:

{[ regexp { Memory: \(.*%\)}
这将匹配类似于的字符串

"Memory: (71%)"
然后,您需要说明要捕获的百分比之前和之后的字符。有几种方法可以做到这一点,包括:

  • 您可以使用组捕获感兴趣的子表达式,并在
    内存
    和百分比之间留出额外字符,因此:

    {[regexp{Memory:.*(.*%\)}

  • 它将查找一个具有
    内存的字符串:
    后跟以
    (XXXX5)
    结尾的任意数量的字符,其中
    X
    是一个不确定的字符数,因此匹配的内容包括
    (71%)
    ,但也可能是
    (ABC%)

  • 您可以编码到您知道的更具体的上下文中。当您知道要查找数字时,不要使用通配符,所以可能

    {[regexp{Memory:.\(\d+%\)}

  • 在匹配组中只能找到一个或多个数字,后跟
    %
    。如果您知道将有两个数字,请指定该数字并获得更好的匹配:

    `{[ regexp { Memory:.*\(\d\d%\)}`
    

    两者都只查找两个数字

    最后,询问为什么需要从字符串中提取
    内存
    。是否需要确保匹配的百分比仅来自这些行,这表明文本中的其他行也有百分比?好的,您需要匹配
    内存
    。但是如果这些百分比仅在
    内存
    行中,请删除该要求用一个简单的

    `{[ regexp { \(\d{2}%\) }`
    

    它将匹配任何包含两个数字的括号,后面紧跟着一个
    %

    ,首先,您必须转义正则表达式中的
    ),使其与该字符匹配,因此:

    {[ regexp { Memory: \(.*%\)}
    
    set s "Memory: 327127123k. total, 2334437k used (71%), 9345624 k free (29%), 1123k buffers"
    
    这将匹配类似于的字符串

    "Memory: (71%)"
    
    然后,您需要说明要捕获的百分比之前和之后的字符。有几种方法可以做到这一点,包括:

  • 您可以使用组捕获感兴趣的子表达式,并在
    内存
    和百分比之间留出额外字符,因此:

    {[regexp{Memory:.*(.*%\)}

  • 它将查找一个具有
    内存的字符串:
    后跟以
    (XXXX5)
    结尾的任意数量的字符,其中
    X
    是一个不确定的字符数,因此匹配的内容包括
    (71%)
    ,但也可能是
    (ABC%)

  • 您可以编码到您知道的更具体的上下文中。当您知道要查找数字时,不要使用通配符,所以可能

    {[regexp{Memory:.\(\d+%\)}

  • 在匹配组中只能找到一个或多个数字,后跟
    %
    。如果您知道将有两个数字,请指定该数字并获得更好的匹配:

    `{[ regexp { Memory:.*\(\d\d%\)}`
    

    两者都只查找两个数字

    最后,询问为什么需要从字符串中提取
    内存
    。是否需要确保匹配的百分比仅来自这些行,这表明文本中的其他行也有百分比?好的,您需要匹配
    内存
    。但是如果这些百分比仅在
    内存
    行中,请删除该要求用一个简单的

    `{[ regexp { \(\d{2}%\) }`
    
    它将匹配任何包含两个数字的括号,后面紧跟着一个
    %

    set s "Memory: 327127123k. total, 2334437k used (71%), 9345624 k free (29%), 1123k buffers"
    
    要获得
    内存:(71%)

    除非行中的第一个单词发生更改,否则您只需要匹配和提取这个(
    \d\d%

    如果非空格字符组的数量不变,则实际上甚至不需要正则表达式:

    format {Memory: %s} [string trim [lindex $s 5] ,]
    
    两种变体都给出了

    Memory: (71%)
    
    尽可能避免正则表达式匹配

    文件: , , , ,

    要获得
    内存:(71%)

    除非行中的第一个单词发生更改,否则您只需要匹配和提取这个(
    \d\d%

    如果非空格字符组的数量不变,则实际上甚至不需要正则表达式:

    format {Memory: %s} [string trim [lindex $s 5] ,]
    
    两种变体都给出了

    Memory: (71%)
    
    尽可能避免正则表达式匹配

    文件: , , , ,

    正则表达式的关键是思考“如何使此匹配成为我想要的部分?”在这里,您要选择第一个冒号之前的第一个单词(包括第一个冒号),跳过所有内容,直到第一个括号之后,然后匹配并包括下一个括号。要记住的主要技巧是,括号用作文字时需要反斜杠,否则它们会元字符

    set str "Memory: 327127123k. total, 2334437k used (71%), 9345624 k free (29%), 1123k buffers"
    
    if {[regexp {^([^:]*:)[^()]*(\([^()]*\))} $str -> a b]} {
        puts "$a $b"
    } else {
        error "didn't match at all"
    }
    
    分解RE时,有以下几部分:

    • ^
      -字符串锚的开始。因为这通常是个好主意
    • [^:::][/code>
      *
      -捕获第一个冒号之前的所有内容,即,所有不是冒号的内容,然后是冒号
    • [^()]
      *
      -任意数量的非括号
    • \(
      [^()]
      *
      \)
      -捕获任何非括号序列周围的括号

      • 正则表达式的关键在于思考“我如何才能使此匹配成为我想要的部分?”并编写RE以与tha一起工作