有很多地方可以显示您匹配不包含单词的字符串。我想要做的是使用正则表达式匹配一个字符串,然后测试该字符串是否包含一个单词。
换句话说,这就是我要找的东西:
我有文字:
.........(注意每个块以<“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..."
答案 0 :(得分:0)
试试这个:(?s)\n[^\n]+?DW_TAG_structure_type.*?\n(?![^\n]*sibling).*?(?=..\d+><)