単語を含まない文字列に一致することを示している場所がたくさんあります。私がやりたいことは、正規表現を使用して文字列を照合し、その文字列に単語が含まれているかどうかをテストすることです。
言い換えれば、これは私が探しているものです:
私はテキストを持っています:
.........(すべてのチャンクが <"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..."