除了 <NIS/>,<NONNATIVE/> 和空格之外,删除所有字符。

3
我有一个包含大量字符串数据的datatable,我想要删除除了<NIS/><NONNATIVE/>和空格之外的字符。例如, before: " There are<NONNATIVE/> not<NIS/> <NIS/> correct" after: " <NONNATIVE/> <NIS/> <NIS/> ". 由于数据量很大,我希望找到一种快速处理它的方法,有人能帮帮我吗?
3个回答

1
你可以这样做,我想。
var before = " There are<NONNATIVE/> not<NIS/> <NIS/> correct";
var after = new StringBuilder();

Regex.Replace(before, @"( |<NONNATIVE\/>|<NIS\/>)", m =>
{
    after.Append(m.Value);
    return "";
});

它将捕获您想要接受并添加到StringBuilder中的内容,然后您只需要将其转换为ToString。
//   <NONNATIVE/> <NIS/> <NIS/> 
after.ToString();

1
谢谢!这个方法每个数据的成本是0.0005秒。 - Power Debugger

1
您可以使用以下内容。
string input  = " There are<NONNATIVE/> not<NIS/> <NIS/> correct";
string output = Regex.Replace(input, @"((?> |<NIS\/>|<NONNATIVE\/>)*)\S?", "$1");

// "  <NONNATIVE/> <NIS/> <NIS/> "

请看

查看 实时演示


非常感谢,这种方式每个数据只需要0.0001秒的成本!! - Power Debugger

0

不确定性能如何,但这也可以工作:

string input1 = " There are<NONNATIVE/> not<NIS/> <NIS/> correct";
string[] approvedlist = {"<NONNATIVE/>","<NIS/>"};
string output1 = string.Join(" ", (from s in input1.Split(@"<>".ToCharArray())
                                           where approvedlist.Contains(s)
                                           select "<" + s + ">").ToArray());

我进行了性能测试,结果与Bruno的示例几乎相同,使用了100,000个字符,并在每5-20个字符中随机插入了所需的字符串。

经过一些优化并考虑了您的进一步评论,我得出了以下结论:

        string[] approvedlist = {"<NONNATIVE/>","<NIS/>"};
        var output2 = new StringBuilder();
        foreach(string s in input1.Split(@"<>".ToCharArray()))
            if(approvedlist.Contains(s))
                output2.AppendFormat("<{0}> ", s);

在我的测试中,这比迄今为止的所有其他东西表现都要好。

谢谢!也许使用 LINQ 会很耗费,但这种方式每个数据只需要 0.03 秒的时间。 - Power Debugger
我注意到这种方法和正则表达式方法之间的一个区别。这种方法在每个要返回的元素之间都放置了空格,而正则表达式只在某些元素之间有空格。我也想看看你是如何测试这个的,因为我得到了非常不同的结果。 - tinstaafl
我的测试字符串不像你使用的那么长,还有一些其他的标签,比如"<UNKNOW/>",这些也应该被移除。 - Power Debugger
你可能需要一个更大的测试字符串来获得更真实的结果。我进行了更多的思考,并能够进一步优化我的代码并将输出限制为你想要的标签。 - tinstaafl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接