C# 使用C查找字符串中的整数并将其除以

C# 使用C查找字符串中的整数并将其除以,c#,C#,我试图在a.txt中找到我在C中读取的整数并将其除法,但我尝试的一切都没有成功。有什么建议吗? 此txt具有如下值: string text = @"queue1 6000, queue2 54888, queue3 1"; var re = new Regex(@"\b\d+\b"); string output = re.Replace(text, m => (Int64.Parse(m.Value) / 10000.0).ToString()); // output == "queu

我试图在a.txt中找到我在C中读取的整数并将其除法,但我尝试的一切都没有成功。有什么建议吗? 此txt具有如下值:

string text = @"queue1 6000, queue2 54888, queue3 1";
var re = new Regex(@"\b\d+\b");
string output = re.Replace(text, m => (Int64.Parse(m.Value) / 10000.0).ToString());
// output == "queue1 0.6, queue2 5.4888, queue3 0.0001"
这是.txt文件中的字符串 排队1 6000 队列254888 队列3 1 但它们每秒钟都在变化

预期产量 队列10.6 2.5.4 队列3 0.0001 代码


谢谢

您可以使用正则表达式:

Regex.Matches(text, @"(?<=^|\s)[0-9]+(?=$|\s)").Cast<Match>().Select(m => int.Parse(m.Value));
首先,选择字符串中与整数相似的所有部分,然后将结果字符串转换为整数

?=$|\s是零宽度正向前瞻断言。它检查匹配的结尾是否有空格或字符串结尾

?您可以使用获取字符串中的所有数字。例如,字符串可以是从System.IO.file.ReadAlltext获取的文件内容

您可以使用[0-9]+获取所有整数,或者使用[0-9]+[0-9]+?获取整数和浮点

var pattern = "[0-9]" // or "[0-9]+(.[0-9]+)?"
int[] integers = System.Text.RegularExpressions.Regex.Matches(text, pattern).Cast<Match>().Select(m => int.Parse(m.Value)).ToArray();
// for floats
//float[] floats = System.Text.RegularExpressions.Regex.Matches(text, pattern).Cast<Match>().Select(m => float.Parse(m.Value)).ToArray();
在正则表达式中,定义一个模式,然后在字符串中搜索符合该模式的标记。如果我们需要搜索整数,那么我们可以使用[0-9]+模式。此模式将搜索0-9之间(含0-9)的所有标记,其中至少包含一个字符和一个数字,“+”确保这一点。 如果我们需要搜索浮点,那么我们需要使用[0-9]+[0-9]+?它由整数模式[0-9]+和可选浮点[0-9]+组成?。“?”符号表示此令牌可以存在零次或一次


您可以找到有关正则表达式和模式的更多信息

您的代码需要做以下几件事:

读取输入 在输入中找到目标值 将目标值转换为所需的结果值 用结果值替换输入字符串中的目标值 输出结果 对于这个答案,我假设您对步骤1和步骤5的实现感到满意,所以我只介绍步骤2、步骤3和步骤4

步骤2:找到目标值

要在输入中找到目标值,必须首先定义它们是什么。根据您的问题和随后的注释,您的输入字符串如下所示,目标值以粗体显示:

队列1 6000、队列2 54888、队列3 1

这些是整数值,作为离散词嵌入到文本中

找到它们的最简单方法是使用正则表达式。让您的案例变得棘手的一点是,您的文本中嵌入了您不想要的数字,例如,在queue1中。幸运的是,有几个快捷方式可以轻松编写必要的表达式:

var re = new Regex(@"\b\d+\b");
\b匹配单词边界 \d匹配任何十进制数字 +匹配前面的一个或多个字符

所以这个正则表达式将匹配不同的整数,比如6000,而忽略嵌入在其他单词中的数字,比如queue1

步骤3-转换为所需结果

此步骤有两个子步骤

将字符串解析为数字 计算所需的结果数 格式化所需的结果编号 要将字符串解析为数字,可以使用int.TryParse,这是一种方法。由于正则表达式只能找到有效整数,因此我们可以改用Parse方法

您的计算是除以10000,并且希望结果是一个浮点数。如果使用10000作为文本,结果将是一个整数,因此需要采取措施确保结果是浮点。一种简单的方法是使用10000.0作为文字,如下所示:

int value = 6000;
var result = value / 10000.0; // typeof(result) == double
有几个选项可以设置输出的格式。最简单的起点是使用ToString方法。默认行为通常已经足够好了,但是如果要指定格式,可以使用

因此,解析、计算和格式化的结果代码如下:

(Int64.Parse(value) / 10000.0).ToString()
步骤4:替换输入中的目标值

因为正则表达式对于查找对象很有用,所以它们也用于替换对象。在您的情况下,替换需要一些可能无法由直接正则表达式处理的逻辑,即步骤2。.NET正则表达式替换方法仅为这种情况提供了一种新的方法

正则表达式找到的每个匹配项都会传递给匹配计算器,该计算器负责返回要用作替换项的字符串。为了简化操作,可以使用lambda表达式提供匹配计算器

所以,当你把所有这些放在一起时,你会得到如下结果:

string text = @"queue1 6000, queue2 54888, queue3 1";
var re = new Regex(@"\b\d+\b");
string output = re.Replace(text, m => (Int64.Parse(m.Value) / 10000.0).ToString());
// output == "queue1 0.6, queue2 5.4888, queue3 0.0001"

你能分享一下mytext.txt文件中的内容吗?如你所见,file.ReadAllText给你一大块字符串。其中的所有内容都将位于int.TryParsetext,out值中。如果可能的话,甚至你的单词也会被解析成整数。但这是不可能的。@Chad在.txt文件中是这样的值:queue1 5122,queue2 1,queue3 8000……请显示一些精确的输入和预期的输出
t请回答您的问题。这些值是在文本文件中的单独行上,还是在您的注释中用逗号分隔?如果输入包含queue1之类的文本,则此操作将无效。请参阅OP上关于文件内容的注释。感谢您的详细解释!这很有效!