我有一个巨大的文件,我想要删除文件中的所有内容,除了匹配我的正则表达式。我知道我可以获得匹配并只提取它们,但我想保留我的文件并摆脱其他一切。
这是我的正则表达式:
"Id":\d+
如何说“匹配所有除了 "Id":\d+
”。
!("Id":\d+) (pseudo regex)
?
我想将它与Regex Replace功能一起使用。用英语我想说:
获取所有不是
"Id":\d+
的文本,并将其替换为空字符串。
答案 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 +之外的所有匹配标准,但是它可以完成工作