gpt4 book ai didi

c# - 删除字符串中的额外间距 [Fastest Way]

转载 作者:行者123 更新时间:2023-11-30 14:34:17 24 4
gpt4 key购买 nike

我需要删除字符串中的所有额外空格。我使用正则表达式来匹配字符串和匹配的字符串,我用其他一些替换。为了更好地理解,请参阅以下示例:

3个输入字符串:

Hello, how are you?
Hello , how are you?
Hello , how are you ?

这是应该由一个模式正则表达式匹配的 3 个字符串。它看起来像这样:

Hello\s*,\s+how\s+are\s+you\s*?

它工作正常,但存在性能问题。如果我有很多模式(~20k)并尝试执行每个模式,它运行得非常慢(3-5 分钟)。

也许有更好的方法来做到这一点?例如使用一些 3d 方库?

UPD:伙计们,这个问题不是关于如何做的。这是关于如何以最佳性能做到这一点。 :)


让我解释得更详细些。主要目标是标记化文本。 (用特殊符号替换一些token)

例如,我有一个标记“nice try”。然后我输入文本“这是很好的尝试”。结果:“这是@tokenizedtext@”,其中@tokenizedtext@ 一些特殊符号。在这种情况下没关系。

接下来我有字符串“Mike said it was a nice try”。结果应该是“Mike said it was a @tokenizedtext@”。我认为主要思想很明确。

所以我可以有很多代币。当我处理它时,我将我的 token 从“nice try”转换为模式“nice\s+try”。并尝试用此模式输入文本替换。它工作正常。但是,如果在标记中有更多的空格并且还有标点符号,那么我的正则表达式会变得更大并且运行起来非常慢。

您对解决这个问题有什么建议(技术上或逻辑上的)吗?

最佳答案

我可以提出一些解决方案。

首先,避免使用静态Regex 方法。创建它的实例(并存储它,不要为每个替换调用构造函数!),如果可能,使用 RegexOptions.Compiled。它应该会提高您的表现。

其次,您可以尝试检查您的模式。我会做一些分析,但我目前犹豫不决:

@"(?<=\s)\s+"

替换为空字符串或:

@"\s+"

用空格代替。同时,您可以尝试这段代码:

var s = "Hello , how are  you?";
var pattern = @"\s+";
var regex = new Regex(pattern, RegexOptions.Compiled);
var replaced = regex.Replace(s, " ");

编辑:进行一些测量后,第二个模式似乎更快。我正在编辑我的样本以适应它。

编辑 2:我编写了一个不安全 方法。它比这里介绍的其他方法(包括 Regex 方法)快得多,但是,正如这个词本身所说的那样,它是不安全的。我不认为我编写的代码有任何问题,但我可能是错的 -- 所以,请反复检查,以防方法中出现错误。

static unsafe string TrimInternal(string input)
{
var length = input.Length;
var array = stackalloc char[length];
fixed (char* fix = input)
{
var ptr = fix;
var counter = 0;
var lastWasSpace = false;
while (*ptr != '\x0')
{
//Current char is a space?
var isSpace = *ptr == ' ';
//If it's a space but the last one wasn't
//Or if it's not a space
if (isSpace && !lastWasSpace || !isSpace)
//Write into the result array
array[counter++] = *ptr;
//The last character (before the next loop) was a space
lastWasSpace = isSpace;
//Increase the pointer
ptr++;
}
return new string(array, 0, counter);
}
}

用法(使用/unsafe 编译):

var s = TrimInternal("Hello    , how       are     you?");

在发布版本中进行分析,优化,1000000 次迭代:

My above solution with Regex: 00:00:03.2130121

The unsafe solution: 00:00:00.2063467

关于c# - 删除字符串中的额外间距 [Fastest Way],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14317772/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com