Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.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
如何在TCL中匹配regexp中的2位数字?_Regex_String_Tcl - Fatal编程技术网

如何在TCL中匹配regexp中的2位数字?

如何在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

我需要使用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 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
    选项
  • 在表达式中同时使用大写和小写字符
  • 匹配前将字符串转换为小写
  • 添加嵌入选项以关闭区分大小写功能
  • 其中,最后一个可能是最不明显的解决方案,因此我将在这里介绍它

    Tcl表达式可以在模式的最开始有一个特殊的序列来修改正则表达式的工作方式。在这种情况下,我们想告诉它忽略这个案例。方法是在模式的开头添加
    (?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
    选项
  • 在表达式中同时使用大写和小写字符
  • 匹配前将字符串转换为小写
  • 添加嵌入选项以关闭区分大小写功能
  • 其中,最后一个可能是最不明显的解决方案,因此我将在这里介绍它

    Tcl表达式可以在模式的最开始有一个特殊的序列来修改正则表达式的工作方式。在这种情况下,我们想告诉它忽略这个案例。方法是在模式的开头添加
    (?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个?