有很多地方会告诉您匹配不包含单词的字符串。我想要做的是使用正则表达式来匹配一个字符串,然后测试该字符串是否包含一个单词。
换句话说,这就是我要找的:
我有文字:
.........(注意每个块都以 <"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..."