匹配除指定正则表达式之外的所有内容

时间:2010-10-04 15:27:42

标签: regex .net-4.0

我有一个巨大的文件,我想要删除文件中的所有内容,除了匹配我的正则表达式。我知道我可以获得匹配并只提取它们,但我想保留我的文件并摆脱其他一切。

这是我的正则表达式:

"Id":\d+

如何说“匹配所有除了 "Id":\d+”。

的内容

!("Id":\d+) (pseudo regex)

我想将它与Regex Replace功能一起使用。用英语我想说:

  

获取所有不是"Id":\d+的文本,并将其替换为空字符串。

4 个答案:

答案 0 :(得分:2)

试试这个:

string path = @"c:\temp.txt"; // your file here
string pattern = @".*?(Id:\d+\s?).*?|.+";
Regex rx = new Regex(pattern);

var lines = File.ReadAllLines(path);
using (var writer = File.CreateText(path))
{
    foreach (string line in lines)
    {
        string result = rx.Replace(line, "$1");
        if (result == "")
            continue;

        writer.WriteLine(result);
    }
}

该模式将在同一行上的多个 Id:Number 出现之间保留空格。如果每行只有一个Id,则可以从模式中删除\s?File.CreateText将打开并覆盖您现有的文件。如果替换导致空字符串,则将跳过该字符串。否则结果将写入文件。

模式的第一部分匹配 Id:Number 出现次数。它包括.+的替代,以匹配 Id:Number 未出现的行。替换使用$1将匹配替换为第一组的内容,即实际Id部分:(Id:\d+\s?)

答案 1 :(得分:1)

抱歉,但我完全不明白你的问题。将匹配项打成新文件应该不容易吗?

Yoo写道:

  

获取所有不是“Id”的文本:\ d +并将其替换为空字符串。

逻辑等效物是:

  

获取与"Id":\d+匹配的所有文本并将其放入新文件中。用新文件替换旧文件。

答案 2 :(得分:1)

嗯,\d的反义词是perl-ish regex中的\D。 .net有类似的东西吗?

答案 3 :(得分:0)

之前我没有使用过.net,但是后续工作在java

System.out.println("abcd Id:12351abcdf".replaceAll(".*(Id:\\d+).*","$1"));

产生输出

Id:12351

虽然在真正意义上它不符合除Id:\ d +之外的所有匹配标准,但是它可以完成工作