我想捕获以下头文件中的所有两位数字:
#define KEYMAP( \
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \
K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
K40, K41, K42, K45, K49, K4A, K4B, K4C, K4D \
)
所以我想得到一个包含00,01,02 ..... 4D的清单。我尝试使用Select-String
cmdlet执行此操作:
gc 'y:\keyboard.h' | sls 'K'
但是没有给我预期的结果
答案 0 :(得分:2)
在模式中使用lookbehind断言和正确的十六进制捕获模式(请参阅regex101):
gc 'y:\keyboard.h' | select-string '(?<=K)([\da-f]{2})' -AllMatches | %{ $_.matches.value }
默认情况下, Select-String
在敏感匹配中使用大小写,如果需要,请使用其-CaseSensitive
开关。可以使匹配更严格,以拒绝来自文件其他部分的可能误报:'\s+(?<=K)([\da-fA-F]{2})(?:[\s,]|$)' -CaseSensitive
答案 1 :(得分:1)
我会使用静态regex::Matches方法:
$content = Get-Content 'y:\keyboard.h' -Raw
[regex]::Matches($content, '\bK(..),') | Foreach {
$_.Groups[1].Value
}
<强>输出:强>
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 40 41 42 45 49 4A 4B 4C