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一起工作