正则表达式:找到包含X但不包含Y的行

时间:2014-12-04 17:51:24

标签: c# regex

[Hi my name is Tom Baker.]
[Hi my name is Jim 
Knopf.]
[Hi my name is Ben Hubbard.]

我需要一个C#/ .Net的正则表达式匹配“[我的名字是{除了”Ben“之外的任何东西}} {任何可以遵循的}}”

我查找了解释如何排除单词的所有示例,但它们都与正则表达式不匹配。我想要完全相反。

如果正则表达式的其他规则适用,但不包含单词X,那就是匹配。

其他问题:此正则表达式需要是多行正则表达式。

到目前为止我得到的是:

(?m)\[Hi my name is (.|\r|\n).*?\]

而不是(。| \ r | \ n)中的第一个点,我需要一个基本上表示“如果此部分不包含'Ben'则表示匹配”的表达式。

修改

对不起,我需要以两种方式调整我的请求,当我看到给定的答案时,我才意识到这些信息已被忽略。

1)我写的时候

我需要一个C#/ .Net的正则表达式匹配“[我的名字是{除了”Ben“之外的任何东西}} {任何可以遵循的}}”

我的意思是

我需要一个与C#/ .Net相匹配的正则表达式“[我的名字是{任何东西都可以在这里} {除了”Ben“之外的任何东西} {}任何东西都可以在这里}]”

2)正则表达式本身必须包含多行正则表达式的规则,这就是为什么\ r \ n和/或(?m)是我第一次尝试的原因,由于复杂的原因我不能使用Multiline选项在构造Regex实例时。

尝试用另一个例子来设想我的问题:想象一下,你试图找到你的C#代码中没有实现IDisposable的所有类。在类名和冒号之后的任何地方都有许多接口,其中一个可能是也可能不是IDisposable。类声明仅在实际实现的开始时

结束
public class Test : BaseTest, IDisposable, ICloneable { //no match

public class Test : BaseTest
    , ICloneable
    , IDisposable
{                                                       //no match

public class Test : BaseTest
    , ICloneable
{                                                       //match

这就是我想要完成的事情。

2 个答案:

答案 0 :(得分:2)

尝试:

\[Hi,? my name is (?!Ben)[^\]]+\]
  1. [Hi my name is
  2. 之后使用或不使用逗号匹配Hi
  3. 匹配Ben
  4. 以外的任何内容
  5. 继续抓住]
  6. 你可以像以下一样使用它:

    string str = @"[Hi my name is Tom Baker.]
                   [Hi my name is Jim 
                   Knopf.]
                   [Hi, my name is Ben Hubbard.]";
    
    var pattern = @"\[Hi,? my name is (?!Ben)[^\]]+\]";
    var result = Regex.Matches(str, pattern, RegexOptions.Multiline);
    
    //result contains [Hi my name is Tom Baker.] and [Hi my name is Jim Knopf.]
    

    如果您不想要包含逗号的匹配项,则可以排除,?

答案 1 :(得分:0)

这将匹配名称不是开头的所有行与" Ben" (所以Ben Hubbard将不匹配,但Hubbard Ben会:)

(?m)\[Hi my name is ((?!Ben)|\r|\n).*?\]

如果您想匹配任何不等于Ben的名称(因此Ben匹配,但Ben Hubbard将匹配),您必须使用此正则表达式:

(?m)\[Hi my name is ((?!Ben).*|Ben.+|\r|\n)\]

如果您希望{em} (<{1>} (甚至Ben不匹配),则以下正则表达式将完成此任务:

John McBenson