如何在TCL中匹配regexp中的2位数字?
我需要使用regexp匹配以下字符串:如何在TCL中匹配regexp中的2位数字?,regex,string,tcl,Regex,String,Tcl,我需要使用regexp匹配以下字符串: "The value is 0x0208 and the type is INTERNATION" repexp "0x(\[0-9]+)\[^\\n]+INTERNALION" "The value is 0x0208 and the type is INTERNATION" whole first second 我想得到数字02和08,并将它们存储到不同的两个变量中,我使用以下regexp: "The value is 0x0208 and the
"The value is 0x0208 and the type is INTERNATION"
repexp "0x(\[0-9]+)\[^\\n]+INTERNALION" "The value is 0x0208 and the type is INTERNATION" whole first second
我想得到数字02和08,并将它们存储到不同的两个变量中,我使用以下regexp:
"The value is 0x0208 and the type is INTERNATION"
repexp "0x(\[0-9]+)\[^\\n]+INTERNALION" "The value is 0x0208 and the type is INTERNATION" whole first second
它不能得到第二个,如何修复它?首先,对正则表达式使用大括号,这使它们更容易阅读,因为您不必使用额外的反斜杠 第二,对数字使用\d使表达式略短,这也提高了可读性 搜索成对的数字 在描述中,您表示要搜索
0x
后面的两对数字。下面是一个简单的方法:
{0x(\d\d)(\d\d)}
这表示“0x,后跟我们捕获的两个数字,后跟我们捕获的两个数字”
搜索十六进制字符
通常,十六进制数前面有0x
,这让我觉得您实际上是在解析十六进制数。如果这是真的,你需要搜索的不仅仅是数字。要匹配十六进制数字,您需要使用[0-9a-f]
。一旦一个模式变得稍长(例如:[0-9a-f]
与\d
),您就不想继续重复它,所以说“其中两个”的另一种方法是使用{2}
,而不是重复该模式
综上所述,要匹配两组两个十六进制数字,您可以使用如下内容:
{0x([0-9a-f]{2})([0-9a-f]{2})}
处理大小写
请注意,此模式假定十六进制数字为小写。如果您的特定数据可能有大写字母,则至少有四种处理方法:
regexp
命令使用-nocase
选项(?i)
:
{(?i)0x([0-9a-f]{2})([0-9a-f]{2})}
有关嵌入式选项的详细信息,请参见 首先,对正则表达式使用大括号,这使它们更易于阅读,因为不必使用额外的反斜杠 第二,对数字使用\d使表达式略短,这也提高了可读性 搜索成对的数字 在描述中,您表示要搜索
0x
后面的两对数字。下面是一个简单的方法:
{0x(\d\d)(\d\d)}
这表示“0x,后跟我们捕获的两个数字,后跟我们捕获的两个数字”
搜索十六进制字符
通常,十六进制数前面有0x
,这让我觉得您实际上是在解析十六进制数。如果这是真的,你需要搜索的不仅仅是数字。要匹配十六进制数字,您需要使用[0-9a-f]
。一旦一个模式变得稍长(例如:[0-9a-f]
与\d
),您就不想继续重复它,所以说“其中两个”的另一种方法是使用{2}
,而不是重复该模式
综上所述,要匹配两组两个十六进制数字,您可以使用如下内容:
{0x([0-9a-f]{2})([0-9a-f]{2})}
处理大小写
请注意,此模式假定十六进制数字为小写。如果您的特定数据可能有大写字母,则至少有四种处理方法:
regexp
命令使用-nocase
选项(?i)
:
{(?i)0x([0-9a-f]{2})([0-9a-f]{2})}
有关嵌入式选项的详细信息,请参见 我知道OP使用了[0-9],但不知何故,他或她似乎更可能是在使用十六进制数字,而不是十进制数字。只是一个想法。可能更好的方法是使用
{(?i)\y0x([0-9a-f]{2})([0-9a-f]{2})\y}
,这样它就固定在一个单词的边界上了。@Hoodiecrow:你说得很好。我已将我的答案更新为与所有十六进制数字匹配的地址。@DonalFellows:一般来说,我同意。然而,对于那些不能独立完成\d\d
的人来说,引入单词锚可能比他们愿意接受的还要多。根据我编辑的答案,模式已经开始变得有点复杂了(从初学者的角度来看),我知道OP使用了[0-9],但不知何故,他或她似乎更可能是在十六进制数字之后,而不是十进制数字。只是一个想法。可能更好的方法是使用{(?i)\y0x([0-9a-f]{2})([0-9a-f]{2})\y}
,这样它就固定在一个单词的边界上了。@Hoodiecrow:你说得很好。我已将我的答案更新为与所有十六进制数字匹配的地址。@DonalFellows:一般来说,我同意。然而,对于那些不能独立完成\d\d
的人来说,引入单词锚可能比他们愿意接受的还要多。根据我编辑的答案,模式已经开始变得有点复杂了(从初学者的角度来看),您是否希望值始终是4个十六进制数字,或者可能是6或8个?您是否希望值始终是4个十六进制数字,或者可能是6或8个?