【问题标题】:Match regex if it does not contain string [duplicate]如果它不包含字符串,则匹配正则表达式 [重复]
【发布时间】: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 关于何时将此代码投入生产的建议,但问题仍然有效。了解更多关于正则表达式的信息没有错。

标签: c# .net regex


【解决方案1】:

试试这个:(?s)\n[^\n]+?DW_TAG_structure_type.*?\n(?![^\n]*sibling).*?(?=..\d+&gt;&lt;)

【讨论】:

  • 会让你恢复平衡。这不值得投反对票。
  • Ωmega 我没有对你的问题投反对票。我应该早点用作业标签标记这个问题,因为我的目的是学习。我感谢您的帮助。虽然我不能让你的答案起作用......
猜你喜欢
  • 2020-12-19
  • 1970-01-01
  • 2018-01-15
  • 1970-01-01
  • 2020-08-30
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多