📄 express.inc
字号:
;=======================================================================================
;! 条件取反,取反条件必须使用表达式包含,如!(\.),不是制表符或空格,!(.)*表示跳过所有空格与制表符(如果有)
;? 一个任意字符
;. 一个空格或制表符
;, 一个字词分隔符(包含.)
;% 一个单词字符,字符是否是一个单词以字符表来定义
;*<>|[] 0或更多,如果有结束条件,是直到[结束条件],如:?*<=>,直到碰到=号
;+<>|[] 1或更多,如果有结束条件,是直到[结束条件],如:?+<=>,直到碰到=号
;<>与[]的区别在于,<>是表示如果匹配结束是<结束条件>起的使用,结束条件也是匹配目标,如:
;在"abcd"中查找"abc*<d>",匹配目标为abcd,如果使用abc*[d],则匹配目标为abc
;*号为可忽略符号,带条件的*表达式可理解为如果没有则忽略继续,如果有则跳到匹配之后继续.
;# 转义符,后面跟十六进制数,如#0D表达回车符号,#09表示制表符
;#?表示中文字符,众所周知的原因,向后查找中文字符时请在表达式中加上行首的条件,否则将会有错误
; 如向后查找^.*#?+,查找行首开始的第一个中文词组,如果中文词组前有空格制表符跳过,向下查找时没有限制
;\ 字符,中间的字符是实际符号 如.表示空格制表符\.表示一个"."
;[-] 在范围内 [a-b],或者清单,[abcdef],其中不能使用表达式,除'-'与'\'字符所有均看做正常字符
;" " 不管是否区分大小写,""内包含的必须完全一样
;(...) 表达式,可嵌套,嵌套层次数无限制
;{} 标记并返回{}所包含的区域,可用在任何表达式内.
;| 或者,支持任意表达式成员组合,如:(.)|(a)|((.*<%>)|(%+))
;^ 行首
;$ 行尾
;所有符号除特别说明均可随意组合.所有符号均支持*与+.均可设置条件.
;(*/+)-<>/[]与|的组合能实现很复杂的多条件复合查找.只要是文本,就可以按自己的意思进行查找.
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
EF_DEC = 1h ;向上查找,默认向下
EF_USEEXPRESS = 2h ;使用表达式
EF_WORDCASE = 4h ;区分大小写
EF_MATCHWORD = 8h ;匹配整个单词,包含EF_USEEXPRESS时此标志无效
EF_BEGINNOTLINEBEGIN = 10h ;开始地址不是行首
EF_ENDNOTLINEEND = 20h ;结束地址不是行尾
EF_ENDISSIZE = 40h ;结束地址是一个长度(对EF_DEC无效)
EF_FINDONCE = 80h ;只查找一遍,只对EF_USEEXPRESS有效并且对EF_DEC无效)
EF_MODIFLINESTARTEND = 100h ;修正行首与行尾
EF_DOUBLEISWORD = 200h ;中文字符也是单词
EF_RANGENOTCASE = 400h ;符号[]内的字符总是不大小写
DATARANGE struct
lpStart dd ?
lpEnd dd ?
DATARANGE ends
;字符表,开始地址,结束地址,表达式地址,返回信息数组地址,数组大小,查找标志EF_*
ExpressSearch PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
;成功返回非零值,找不到返回0,错误返回负数,看EFERR_*
;字符表: 可以为0,使用默认字符表,关于字符表,在Express.lib中,这个变量已声明为Public,在你的代码中
; 使用:EXTERN DefCharTable:DWORD,即可引用,可直接修改和使用.也可复制一份,稍做修改为一个不同的字符表
;开始地址: 查找的地址
;结束地址: 结束地址
; 注意,如果查找标志包含EF_DEC,则开始地址与结束地址要交换
;表达式地址: 表达式字符地址,必须以0结束
;返回信息数组地址: 不能为0,必须提供一个指向DATARANGE的结构数组地址,用于返回{}的地址信息
;数组大小: lpDATARANGE的大小,是结构数据元素大小,如:lpdr[100]:DATARANGE,那大小为100
;查找标志: 看EF_*
;脚本折分表达式例子:
;lpExpStr db '^.*{%+}(.+((\"+<{?+[\"]}\">)|({?+[.|($)]})))*[.*$]',0
;lpRetList DATARANGE 100 dup(<?>)
;iCount dd ?
;... ...
;mov iCount,100
;invoke ExpressSearch,0,hMem,lpEndMem,lpExpStr,addr lpRetList,addr iCount,EF_USEEXPRESS
;("+<{?+["]}">)的意思是如果有引号,把引号开始到另一个引号之间的内容做为匹配条件
;如:dir "c:\pro file\1.asm" 4.asm /a /c,表达式查找此行后:
;修改iCount为5
;参数 lpRetList[sizeof DATARANGE*0].lpStart指向匹配字符串的开头
;参数 lpRetList[sizeof DATARANGE*0].lpEnd指向匹配字符串的结束
;-----------------------------------
;参数 lpRetList[sizeof DATARANGE*1].lpStart指向:dir
;参数 lpRetList[sizeof DATARANGE*1].lpEnd指向: "c:\pro.... (注意空格)
;参数 lpRetList[sizeof DATARANGE*2].lpStart指向:c:\pro file\1.asm
;参数 lpRetList[sizeof DATARANGE*2].lpEnd指向: 4.as... (注意空格,以下同)
;参数 lpRetList[sizeof DATARANGE*3].lpStart指向:4.asm
;参数 lpRetList[sizeof DATARANGE*3].lpEnd指向: /a
;参数 lpRetList[sizeof DATARANGE*4].lpStart指向:/a
;参数 lpRetList[sizeof DATARANGE*4].lpEnd指向: /c
;参数 lpRetList[sizeof DATARANGE*5].lpStart指向:/c
;参数 lpRetList[sizeof DATARANGE*5].lpEnd指向:结束
;即第一个DATARANGE数组的成员总是为当前匹配的匹配,其它的为{}返回的地址区域,注意全部都是地址,需要得到第3个返回的内容:
;mov eax,lpRetList[sizeof DATARANGE*3].lpEnd
;sub eax,lpRetList[sizeof DATARANGE*3].lpStart
;invoke lstrcpyn,addr buffer,lpRetList[sizeof DATARANGE*3].lpStart,eax
;-------------------------------------------
;表达式查找时有可能发生的错误:
EFERR_NOTCONST equ -1 ;没有常数定义
EFERR_EXPNOTSUPPORT equ -2 ;不能这样使用符号
EFERR_NOTCLOSEBRACKET equ -3 ;没有关闭括号
EFERR_EMPTYEXPRESS equ -4 ;空的表达式,()/[]/{}/<>
EFERR_NOTEXISTEXP equ -5 ;多余的表达式结束符,请使用\],\),\>等等
EFERR_NOTBYONSELF equ -6 ;表达式符号不能单独使用
EFERR_NOTLOOPEND equ -7 ;对于?*/?+必须设置结束条件,同时,*/+对于?来说是一样的
EFERR_DEADLOOP equ -8 ;在使用*/+的表达式里面的整个表达式均是可忽略的,如(.*)+,因为.*总是成功,后面
;的+要求成功时继续,这是一个死循环.
EFERR_INVALIDEXP equ -9 ;无效表达式,如%*,因为*是可忽略符号,则上述表达式总是成功.
;发生错误后,错误表达式位置返回在 lpRetList[sizeof DATARANGE*1].lpStart 和 lpRetList[sizeof DATARANGE*1].lpEnd 中
;ASCII字符对应标识表,用于快速识别一个字符,类别如下:
;-------------------------------------------------
CF_WORD equ 1h ;单词
CF_NUMBER equ 2h ;数字
CF_HEX equ 4h ;十六进制
CF_BIN equ 8h ;二进制
CF_UPCHAR equ 10h ;大写字符
CF_LOWCHAR equ 20h ;小写字符
CF_COMMENT equ 40h ;注释字符
CF_COMMENTEND equ 80h ;注释第二个字符
CF_TAB equ 100h ;语法线对齐符
CF_SPACE equ 200h ;空格
CF_ENTER equ 400h ;回车
CF_WARP equ 800h ;换行符
CF_MATCH equ 1000h ;包含符,如双引号
CF_SELFMATCH equ 2000h ;包含符,如单引号
CF_INVALID equ 40000000h ;无效/无意义字符字符
CF_DOUBLEBYTE equ 80000000h ;中文字符首
;默认的字符表定义如下:
; DefCharTable dd CF_INVALID
; dd CF_INVALID
; dd CF_INVALID
; dd CF_INVALID
; dd CF_INVALID
; dd CF_INVALID
; dd CF_INVALID
; dd CF_INVALID
; dd CF_INVALID
; dd CF_INVALID or CF_TAB or CF_SPACE ;制表符
; dd CF_INVALID or CF_WARP ;换行符
; dd CF_INVALID
; dd CF_INVALID
; dd CF_INVALID or CF_ENTER ;回车符
; dd CF_INVALID
; dd CF_INVALID
; dd CF_INVALID
; dd CF_INVALID
; dd CF_INVALID
; dd CF_INVALID
; dd CF_INVALID
; dd CF_INVALID
; dd CF_INVALID
; dd CF_INVALID
; dd CF_INVALID
; dd CF_INVALID
; dd CF_INVALID
; dd CF_INVALID
; dd CF_INVALID
; dd CF_INVALID
; dd CF_INVALID
; dd CF_INVALID
; dd CF_SPACE ;空格
; dd 0 ;!
; dd CF_MATCH ;"
; dd 0 ;#
; dd CF_WORD ;$
; dd 0 ;%
; dd 0 ;&
; dd CF_SELFMATCH ;'
; dd 0 ;(
; dd 0 ;)
; dd 0 ;*
; dd 0 ;+
; dd 0 ;,
; dd 0 ;-
; dd 0 ;.
; dd 0 ;/
; ; 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
; dd CF_WORD or CF_NUMBER or CF_HEX or CF_BIN
; dd CF_WORD or CF_NUMBER or CF_HEX or CF_BIN
; dd CF_WORD or CF_NUMBER or CF_HEX
; dd CF_WORD or CF_NUMBER or CF_HEX
; dd CF_WORD or CF_NUMBER or CF_HEX
; dd CF_WORD or CF_NUMBER or CF_HEX
; dd CF_WORD or CF_NUMBER or CF_HEX
; dd CF_WORD or CF_NUMBER or CF_HEX
; dd CF_WORD or CF_NUMBER or CF_HEX
; dd CF_WORD or CF_NUMBER or CF_HEX
; dd 0
; dd 0
; dd 0
; dd 0
; dd 0
; dd 0
; ; @ A B C D E F G H I J K L M N O
; dd CF_WORD
; dd CF_WORD or CF_UPCHAR or CF_HEX
; dd CF_WORD or CF_UPCHAR or CF_HEX
; dd CF_WORD or CF_UPCHAR or CF_HEX
; dd CF_WORD or CF_UPCHAR or CF_HEX
; dd CF_WORD or CF_UPCHAR or CF_HEX
; dd CF_WORD or CF_UPCHAR or CF_HEX
; dd CF_WORD or CF_UPCHAR
; dd CF_WORD or CF_UPCHAR
; dd CF_WORD or CF_UPCHAR
; dd CF_WORD or CF_UPCHAR
; dd CF_WORD or CF_UPCHAR
; dd CF_WORD or CF_UPCHAR
; dd CF_WORD or CF_UPCHAR
; dd CF_WORD or CF_UPCHAR
; dd CF_WORD or CF_UPCHAR
; ; P Q R S T U V W X Y Z [ \ ] ^ _
; dd CF_WORD or CF_UPCHAR
; dd CF_WORD or CF_UPCHAR
; dd CF_WORD or CF_UPCHAR
; dd CF_WORD or CF_UPCHAR
; dd CF_WORD or CF_UPCHAR
; dd CF_WORD or CF_UPCHAR
; dd CF_WORD or CF_UPCHAR
; dd CF_WORD or CF_UPCHAR
; dd CF_WORD or CF_UPCHAR
; dd CF_WORD or CF_UPCHAR
; dd CF_WORD or CF_UPCHAR
; dd 0
; dd 0
; dd 0
; dd 0
; dd CF_WORD
; ; ` a b c d e f g h i j k l m n o
; dd 0
; dd CF_WORD or CF_LOWCHAR or CF_HEX
; dd CF_WORD or CF_LOWCHAR or CF_HEX
; dd CF_WORD or CF_LOWCHAR or CF_HEX
; dd CF_WORD or CF_LOWCHAR or CF_HEX
; dd CF_WORD or CF_LOWCHAR or CF_HEX
; dd CF_WORD or CF_LOWCHAR or CF_HEX
; dd CF_WORD or CF_LOWCHAR
; dd CF_WORD or CF_LOWCHAR
; dd CF_WORD or CF_LOWCHAR
; dd CF_WORD or CF_LOWCHAR
; dd CF_WORD or CF_LOWCHAR
; dd CF_WORD or CF_LOWCHAR
; dd CF_WORD or CF_LOWCHAR
; dd CF_WORD or CF_LOWCHAR
; dd CF_WORD or CF_LOWCHAR
; ; p q r s t u v w x y z { | } ~
; dd CF_WORD or CF_LOWCHAR
; dd CF_WORD or CF_LOWCHAR
; dd CF_WORD or CF_LOWCHAR
; dd CF_WORD or CF_LOWCHAR
; dd CF_WORD or CF_LOWCHAR
; dd CF_WORD or CF_LOWCHAR
; dd CF_WORD or CF_LOWCHAR
; dd CF_WORD or CF_LOWCHAR
; dd CF_WORD or CF_LOWCHAR
; dd CF_WORD or CF_LOWCHAR
; dd CF_WORD or CF_LOWCHAR
; dd 0
; dd 0
; dd 0
; dd 0
; dd CF_INVALID
; dd CF_INVALID
; dd 127 dup(CF_INVALID or CF_DOUBLEBYTE)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -