【发布时间】:2012-06-28 20:20:08
【问题描述】:
有很多地方会告诉你匹配一个不包含单词的字符串。我要做的是使用正则表达式匹配一个字符串,然后测试该字符串是否包含一个单词。
换句话说,这就是我要找的:
我有文字:
.........(注意每个块都以 开头)
<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..."
【问题讨论】:
-
你为什么要把所有这些都塞进一个单一的正则表达式模式中?您可以使用 C#,与尝试将所有内容都塞进一个模式相比,调用 Regex 几次不同的时间并使用一些 C# 逻辑更易于维护。只需匹配您的原始模式,然后执行
if(result.ToLower().Contains("sibling")) { DoSomething(); } -
"我可以在一个组中捕获它,然后测试我需要的内容。" 您可以使用 C# 来完成此操作。你为什么不利用你正在编码的语言的力量?
-
我希望学习...在我使用 c# 环顾四周之前。当我学会如何使用
(?='regex')时,它为我节省了很多时间。我希望在正则表达式方面做得更好 -
正则表达式并不是匹配所有字符串的终极工具。 在某些情况下,它是完成这项工作的正确工具,但在其他情况下,使用编程语言的强大功能而不是尝试与 Regex 一起破解某些东西会更有效、更容易。跨度>
-
我同意 SpikeX 关于何时将此代码投入生产的建议,但问题仍然有效。了解更多关于正则表达式的信息没有错。