正则表达式搜索文字匹配后跟不包含第二个文字的文本
Regex to search for literal match followed by text not containing a second literal
我想匹配以下序列(不区分大小写):
- 字面量 "call"(注意这可能是 rcall 或 call)
- 可变长度白色space(制表符或spaces;无换行符)
- 文字“_”(下划线 - 防止大多数点击包含
文本 "call")
- 任何不包含文字的文本 "boot"
最后一个条件是我的问题。
我正在 Sublime 3 中执行搜索(使用 Perl/Boost 正则表达式语法?)
我尝试修改 javascript regex match word not followed by pattern with text inbetween
中给出的解决方案但未成功
我想到的最好的是
call[\t ]+?_(?:(?!boot).){4,}?
但这取决于函数名称中的字符数。
此搜索的目的是搜索引导加载程序反汇编列表,以确保它没有调用引导加载程序内存之外的任何函数 space(所有受祝福的函数都有文本 "boot" 在他们的名字中)。下划线来自编译器名称修改。
示例文本(命中标记为 HIT)
88811 000294 00 A0 A9 bclr.b _RCONbits,#5 ;,
88813 000296 00 00 07 call _vBootInitSerialBuffer ;
88815 000298 F0 0E 20 mov #239,w0 ;,
88816 00029a 00 00 07 rcall _vBootInitSerial_C1 ;
88818 00029c F0 0E 20 mov #239,w0 ;,
88819 00029e 00 00 07 rcall _vBootInitSerial_C2 ;
88821 0002a0 00 40 EB clr.b w0 ; tmp38
88822 0002a2 00 E0 B7 mov.b WREG,_gbTurnOnLED ; gbTurnOnLED
89049 00032e E0 0F 50 sub w0,#0,[w15] ; tmp56,
89050 Call the routine
89051 000330 00 00 3A bra nz,.L50 ;
89053 000332 10 C0 B3 mov.b #1,w0 ;,
89054 000334 00 00 07 rcall _memcpy ; <HIT>
89055 000336 00 00 37 bra .L50 ;
89054 000334 00 00 07 rcall _BxootGGashLED ; <HIT>
89055 000336 00 00 37 bra .L50 ;
89054 000334 00 00 07 rcall _BootFlashLED ;
89054 000334 00 00 07 call _ln ; <HIT>
89055 000336 00 00 37 bra .L50 ;
89054 000334 00 00 07 call _vBoootFlashLED ; <HIT>
89055 000336 00 00 37 bra .L50 ;
89054 000334 00 00 07 rcall _u8BootGGashLED ;
89055 000336 00 00 37 bra .L50 ;
89054 000334 00 00 07 rcall _u16bootGGashLED ;
89055 000336 00 00 37 bra .L50 ;
89056 .L49:
89058 000338 00 00 80 mov _gu16_50HzTimerTick,w0 ;
您可以简化正则表达式:
r?call[\t ]+_(?!.*boot).*
将从 call
或 rcall
匹配到行尾,如果一路上没有遇到 boot
(在这种情况下它无法完全匹配)。
不要忘记设置不区分大小写的修饰符(或在正则表达式的开头添加 (?i)
)。
测试一下 live on regex101.com。
我想匹配以下序列(不区分大小写):
- 字面量 "call"(注意这可能是 rcall 或 call)
- 可变长度白色space(制表符或spaces;无换行符)
- 文字“_”(下划线 - 防止大多数点击包含 文本 "call")
- 任何不包含文字的文本 "boot"
最后一个条件是我的问题。
我正在 Sublime 3 中执行搜索(使用 Perl/Boost 正则表达式语法?)
我尝试修改 javascript regex match word not followed by pattern with text inbetween
中给出的解决方案但未成功我想到的最好的是
call[\t ]+?_(?:(?!boot).){4,}?
但这取决于函数名称中的字符数。
此搜索的目的是搜索引导加载程序反汇编列表,以确保它没有调用引导加载程序内存之外的任何函数 space(所有受祝福的函数都有文本 "boot" 在他们的名字中)。下划线来自编译器名称修改。
示例文本(命中标记为 HIT)
88811 000294 00 A0 A9 bclr.b _RCONbits,#5 ;,
88813 000296 00 00 07 call _vBootInitSerialBuffer ;
88815 000298 F0 0E 20 mov #239,w0 ;,
88816 00029a 00 00 07 rcall _vBootInitSerial_C1 ;
88818 00029c F0 0E 20 mov #239,w0 ;,
88819 00029e 00 00 07 rcall _vBootInitSerial_C2 ;
88821 0002a0 00 40 EB clr.b w0 ; tmp38
88822 0002a2 00 E0 B7 mov.b WREG,_gbTurnOnLED ; gbTurnOnLED
89049 00032e E0 0F 50 sub w0,#0,[w15] ; tmp56,
89050 Call the routine
89051 000330 00 00 3A bra nz,.L50 ;
89053 000332 10 C0 B3 mov.b #1,w0 ;,
89054 000334 00 00 07 rcall _memcpy ; <HIT>
89055 000336 00 00 37 bra .L50 ;
89054 000334 00 00 07 rcall _BxootGGashLED ; <HIT>
89055 000336 00 00 37 bra .L50 ;
89054 000334 00 00 07 rcall _BootFlashLED ;
89054 000334 00 00 07 call _ln ; <HIT>
89055 000336 00 00 37 bra .L50 ;
89054 000334 00 00 07 call _vBoootFlashLED ; <HIT>
89055 000336 00 00 37 bra .L50 ;
89054 000334 00 00 07 rcall _u8BootGGashLED ;
89055 000336 00 00 37 bra .L50 ;
89054 000334 00 00 07 rcall _u16bootGGashLED ;
89055 000336 00 00 37 bra .L50 ;
89056 .L49:
89058 000338 00 00 80 mov _gu16_50HzTimerTick,w0 ;
您可以简化正则表达式:
r?call[\t ]+_(?!.*boot).*
将从 call
或 rcall
匹配到行尾,如果一路上没有遇到 boot
(在这种情况下它无法完全匹配)。
不要忘记设置不区分大小写的修饰符(或在正则表达式的开头添加 (?i)
)。
测试一下 live on regex101.com。