-5

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

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

我有文字:

.........(注意每个块都以 <"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..."
4

1 回答 1

-1

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

于 2012-06-28T20:31:47.863 回答