簡體   English   中英

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

[英]how to match 2 digit in regexp in TCL?

我有以下字符串需要使用regexp進行匹配:

"The value is 0x0208 and the type is INTERNATION"

我想獲取數字02和08,並將它們存儲到不同的兩個變量中,我使用以下regexp:

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})}

處理大小寫

請注意,此模式假定十六進制數字為小寫。 如果您的特定數據可能包含大寫字母,則至少有四種方法可以處理:

  1. regexp命令使用-nocase選項
  2. 在表達式中同時使用大寫和小寫字符
  3. 匹配之前將字符串轉換為小寫
  4. 添加嵌入式選項以關閉區分大小寫

在這些中,最后一個可能是最不明顯的解決方案,因此在這里我將介紹它。

Tcl表達式在模式的開頭可以有一個特殊的序列,該序列可以修改正則表達式的工作方式。 在這種情況下,我們要告訴它忽略大小寫。 這樣做的方法是在模式的開頭添加(?i)

{(?i)0x([0-9a-f]{2})([0-9a-f]{2})}

有關嵌入式選項的更多信息,請參見re_syntax手冊頁的metasyntax部分

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM