[英]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})}
處理大小寫
請注意,此模式假定十六進制數字為小寫。 如果您的特定數據可能包含大寫字母,則至少有四種方法可以處理:
regexp
命令使用-nocase
選項 在這些中,最后一個可能是最不明顯的解決方案,因此在這里我將介紹它。
Tcl表達式在模式的開頭可以有一個特殊的序列,該序列可以修改正則表達式的工作方式。 在這種情況下,我們要告訴它忽略大小寫。 這樣做的方法是在模式的開頭添加(?i)
:
{(?i)0x([0-9a-f]{2})([0-9a-f]{2})}
有關嵌入式選項的更多信息,請參見re_syntax手冊頁的metasyntax部分 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.