我需要使用regexp匹配以下字符串:
"The value is 0x0208 and the type is INTERNATION"
我想得到数字02和08,并将它们存储到不同的两个变量中,我使用以下正则表达式:
repexp "0x(\[0-9]+)\[^\\n]+INTERNALION" "The value is 0x0208 and the type is INTERNATION" whole first second
它无法获得第二个,如何修复它?
答案 0 :(得分:4)
首先,对正则表达式使用花括号,它使它们更容易阅读,因为你不必使用额外的反斜杠。
其次,使用\ d表示数字使表达式更短,这也提高了可读性。
搜索数字对
在您的说明中,您说要在0x
之后搜索两对数字。这是一个简单的方法:
{0x(\d\d)(\d\d)}
这表示“0x,然后是我们捕获的两个数字,后跟我们捕获的两个数字”
搜索十六进制字符
通常,十六进制数字前面有0x
,这使我认为您实际上正在尝试解析十六进制数字。如果这是真的,您需要搜索的不仅仅是数字。要匹配十六进制数字,您需要使用[0-9a-f]
。一旦模式稍长(例如:[0-9a-f]
与\d
),你不想继续重复它,所以说“其中两个”的另一种方法是使用{{1}而不是重复模式。
将所有内容放在一起,以匹配两组十六进制数字,您可以使用以下内容:
{2}
处理大写和小写
请注意,此模式假设十六进制数字为小写。如果您的特定数据可能包含大写字母,则至少有四种方法可以处理:
{0x([0-9a-f]{2})([0-9a-f]{2})}
命令<{1}}选项
其中,最后一个可能是最不明显的解决方案,所以我会在这里提出。
Tcl表达式在模式的最开头可以有一个特殊的序列来修改正则表达式的工作方式。在这种情况下,我们想告诉它忽略大小写。这样做的方法是在模式的开头添加-nocase
:
regexp
有关嵌入选项的详细信息,请参阅metasyntax section of the re_syntax man page。