正则表达式搜索文字匹配后跟不包含第二个文字的文本

时间:2015-01-23 13:25:44

标签: regex regex-negation

我想匹配以下序列(所有不区分大小写):

  • 字面意思"电话" (请注意,这可能是呼叫或呼叫)
  • 可变长度的空格(制表符或空格;没有换行符)
  • 字面意思" _" (下划线 - 防止大多数点击包含该注释的评论 文字"打电话")
  • 任何不包含文字" boot"
  • 的文字

最后一个条件对我来说是个问题。

我在Sublime 3中执行搜索(使用Perl / Boost正则表达式语法?)

我未能成功修改javascript regex match word not followed by pattern with text inbetween

中给出的解决方案

我提出的最好的是

call[\t ]+?_(?:(?!boot).){4,}?

但这依赖于函数名中的字符数。

此搜索的目的是搜索引导加载程序反汇编列表,以确保它不调用引导加载程序内存空间之外的任何函数(所有祝福函数都有文本" 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    ;

1 个答案:

答案 0 :(得分:1)

您可以简化正则表达式:

r?call[\t ]+_(?!.*boot).*
如果在此过程中未遇到call

将从rcallboot匹配到行尾(在这种情况下,它无法完全匹配)。

不要忘记设置不区分大小写的修饰符(或在正则表达式的开头添加(?i))。

测试live on regex101.com