正则表达式匹配字符前面没有

时间:2014-11-18 07:43:40

标签: .net regex

我有一个文件,我希望在其中找到以" abc'"开头的字符串,包含字符" s",并以&#34结尾末端&#34 ;.这些字符串可以占用多行,但在任何情况下都不包含单词" end"除了标记字符串的结尾。正则表达式看起来像abc' [^ end] s [^ end] 但显然[^ end]不会否定单词" end"。我使用.NET框架,所以我可以访问前瞻/后面可以否定单词,但我以前从未使用过它们,我不确定如何用它来解决这个问题(或者如果他们需要的话。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

(考虑到评论的修改后的答案)

正则表达式非常差,匹配多字符文字。也就是说,它非常擅长匹配"而不是x"或者"不是空格"但是匹配像" end"这样的字符串是非常困难的(有时是不可能的)。这就是为什么我原来尝试这种解决方案的原因甚至都没有尝试过。

鉴于你可以拥有以" abc"开头的字符串。结束"结束",但不要有" s"在他们中,你有一个更大的问题。在这种情况下,我强烈建议使用两个正则表达式:一个匹配外部表达式,然后一个匹配内部异常。使用此方法的一种简单方法是使用Regex.Replace(即使您实际上并不打算进行任何替换),因为它允许您传入代理进行替换。在您的情况下,您可以这样做:

Regex.Replace(s, "abc[\\s\\S]*?end", (m) => {
    if(Regex.IsMatch(m.ToString(), "s")) Console.WriteLine("Found match: " 
        + m.ToString());
    return m.ToString();
});

这实际上不会进行任何替换(因为替换字符串本身就是匹配)。在代表内部,您将能够检查以" abc"开头的所有字符串。结束"结束"。你可以简单地忽略任何没有" s"在他们中间。