匹配正则表达式,如果它不包含字符串

时间:2012-06-28 20:20:09

标签: c# .net regex

有很多地方可以显示您匹配不包含单词的字符串。我想要做的是使用正则表达式匹配一个字符串,然后测试该字符串是否包含一个单词。

换句话说,这就是我要找的东西:

我有文字:

.........(注意每个块以<“number”><“hex number”>开头)

<1><35c>: Abbrev Number: 7 (DW_TAG_array_type)
    <35d>   DW_AT_sibling     : <0x369> 
    <361>   DW_AT_type        : DW_FORM_ref4 <0x4d01>   
<2><366>: Abbrev Number: 8 (DW_TAG_subrange_type)
    <367>   DW_AT_upper_bound : 127 
<1><369>: Abbrev Number: 7 (DW_TAG_array_type)
    <36a>   DW_AT_sibling     : <0x377> 
    <36e>   DW_AT_type        : DW_FORM_ref4 <0x4d01>   
<2><373>: Abbrev Number: 8 (DW_TAG_subrange_type)
    <374>   DW_AT_upper_bound : 511 
<1><377>: Abbrev Number: 9 (DW_TAG_structure_type)
    <378>   DW_AT_sibling     : <0x4cb> 
    <37c>   DW_AT_name        : mem_pool    
    <385>   DW_AT_byte_size   : 68  
<2><386>: Abbrev Number: 10 (DW_TAG_member)
    <387>   DW_AT_type        : DW_FORM_ref4 <0x4d28>   
    <38c>   DW_AT_accessibility: 1  (public)
    <38d>   DW_AT_name        : Type    
    <392>   DW_AT_data_member_location: 2 byte block: 23 0  (DW_OP_plus_uconst: 0)
<1><357>: Abbrev Number: 9 (DW_TAG_structure_type)
    <37c>   DW_AT_name        : mem_pool2   
    <385>   DW_AT_byte_size   : 28  
<1><35c>: Abbrev Number: 7 (DW_TAG_array_type)
    <378>   DW_AT_sibling     : <0x4cb> 
    <37c>   DW_AT_name        : mem_pool    
    <385>   DW_AT_byte_size   : 68

然后获取具有DW_TAG_structure_type的块我使用正则表达式:

(?s)\n[^\n]+?DW_TAG_structure_type.*?(?=..\d+><)    

匹配:

1)

 <1><377>: Abbrev Number: 9 (DW_TAG_structure_type)
    <378>   DW_AT_sibling     : <0x4cb> 
    <37c>   DW_AT_name        : mem_pool    
    <385>   DW_AT_byte_size   : 68  

2)

<1><357>: Abbrev Number: 9 (DW_TAG_structure_type)
    <37c>   DW_AT_name        : mem_pool2   
    <385>   DW_AT_byte_size   : 28  

现在我的问题是我想排除第一个匹配项,如果它包含字符串sibling。所以我试图解决问题的方法是:

 (?s)(?!.*sibling)\n[^\n]+?DW_TAG_structure_type.*?(?=..\d+><)

注意我添加(?!.*sibling)首先环顾四周,以测试兄弟姐妹不在那里。虽然不匹配任何东西。

修改

如果我的第一个正则表达式会很好:

 (?s)\n[^\n]+?DW_TAG_structure_type.*?(?=..\d+><) 

我可以在一个组中捕获它然后测试我需要的东西。做点什么

 (?s)(\n[^\n]+?DW_TAG_structure_type.*?(?=..\d+><))(?=\1 "if group1 cointains sibling then..."

1 个答案:

答案 0 :(得分:0)

试试这个:(?s)\n[^\n]+?DW_TAG_structure_type.*?\n(?![^\n]*sibling).*?(?=..\d+><)