C# 如何从格式不同的字符串中提取数字?

C# 如何从格式不同的字符串中提取数字?,c#,C#,我有一个字符串,如下所示: string str = "data:clientId:12345::processId::23"; 我想在上面的字符串中提取两个数字。它的格式不一样,否则我会在一个分隔符上拆分,并从中取出这两个数字。如何解析abvoe字符串并从中提取这两个数字 string[] tokens = str.Split(':'); 你有什么都没关系,而且: string str = "data:clientId:12345::processId

我有一个字符串,如下所示:

string str = "data:clientId:12345::processId::23";
我想在上面的字符串中提取两个数字。它的格式不一样,否则我会在一个分隔符上拆分,并从中取出这两个数字。如何解析abvoe字符串并从中提取这两个数字

string[] tokens = str.Split(':');

你有什么都没关系,而且:

    string str = "data:clientId:12345::processId::23";
    
    string[] items = str.Split(':');
    
    Console.WriteLine(items[2]);
    Console.WriteLine(items[6]);
输出:

12345
23

你有什么都没关系,而且:

    string str = "data:clientId:12345::processId::23";
    
    string[] items = str.Split(':');
    
    Console.WriteLine(items[2]);
    Console.WriteLine(items[6]);
输出:

12345
23

我真的不认为这个问题有什么问题,除非有什么没有提到或者我遗漏了什么。如果按“:”拆分,则以“::”分隔的部分将作为空字符串返回

因此,您只需要尝试将每个部分解析为一个整数,如果它有效,那么它就是解决方案的一部分

    static int[] ExtractNumbers(string s)
    {
        var toret = new List<int>();
        string[] parts = s.Split( ":" );
        
        foreach(string part in parts) {
            if ( int.TryParse( part, out int x ) )
            {
                toret.Add( x );
            }
        }
        
        return toret.ToArray();
    }
static int[]提取数字(字符串s)
{
var toret=新列表();
string[]parts=s.Split(“:”);
foreach(部分中的字符串部分){
if(内锥棱镜(零件,外锥x))
{
添加(x);
}
}
返回toret.ToArray();
}

我真的不认为这个问题有什么问题,除非有什么没有提到或我遗漏了什么。如果按“:”拆分,则以“::”分隔的部分将作为空字符串返回

因此,您只需要尝试将每个部分解析为一个整数,如果它有效,那么它就是解决方案的一部分

    static int[] ExtractNumbers(string s)
    {
        var toret = new List<int>();
        string[] parts = s.Split( ":" );
        
        foreach(string part in parts) {
            if ( int.TryParse( part, out int x ) )
            {
                toret.Add( x );
            }
        }
        
        return toret.ToArray();
    }
static int[]提取数字(字符串s)
{
var toret=新列表();
string[]parts=s.Split(“:”);
foreach(部分中的字符串部分){
if(内锥棱镜(零件,外锥x))
{
添加(x);
}
}
返回toret.ToArray();
}

一个简单的单行LINQ解决方案检查数字和空字符串:

string str = "data:clientId:12345::processId::23";
var tokens = str.Split(':').Where(t => t.All(char.IsDigit) && string.IsNullOrWhiteSpace(t) == false);

一个简单的单行LINQ解决方案检查数字和空字符串:

string str = "data:clientId:12345::processId::23";
var tokens = str.Split(':').Where(t => t.All(char.IsDigit) && string.IsNullOrWhiteSpace(t) == false);

从字符串中提取数字的一种简单方法是通过正则表达式,正如您可以从以下链接看到的,另一个问题是什么是匹配数字的正则表达式:

作为提取它的代码,您可以使用以下内容:

string inputStr = "data:clientId:12345::processId::23";
string regexPattern = @"\d+";
MatchCollection matches = Regex.Matches(inputStr , regexPattern);
foreach (Match m in matches)
  Console.WriteLine("{0} at index {1}", m.Value, m.Index);
像这样,您应该能够看到字符串中包含的数字,从那里您可以获得forach中的数字,如

int numberVal = Convert.ToInt32(m.Value);

每个匹配一个(输入中应该有两个)

从字符串中提取数字的一种简单方法是通过正则表达式,如下链接到另一个问题,询问匹配数字的正则表达式是什么:

作为提取它的代码,您可以使用以下内容:

string inputStr = "data:clientId:12345::processId::23";
string regexPattern = @"\d+";
MatchCollection matches = Regex.Matches(inputStr , regexPattern);
foreach (Match m in matches)
  Console.WriteLine("{0} at index {1}", m.Value, m.Index);
像这样,您应该能够看到字符串中包含的数字,从那里您可以获得forach中的数字,如

int numberVal = Convert.ToInt32(m.Value);

每个匹配一个(输入中应该有两个)

您在解析什么不同的格式?我的意思是我混淆了
,然后是
。这就是我被困住的原因。如果它只是一个分隔符,那么我会直接对它进行拆分。在使用
拆分之前,先将
替换为
。。现在我明白了,基本上
的一部分,所以它应该按原样工作。只是我需要得到适当的索引才能得到那个值。是的,现在说得通了。对不起,问了个愚蠢的问题。使用
\d+
:(\d+
(?你在解析什么不同的格式?我的意思是我把
搞混了。这就是我被卡住的原因。如果它只是一个分隔符,那么我会直接拆分它。在使用
拆分之前,先用
替换
::
替换
,然后再使用
拆分
啊..现在我基本上明白了
是o部分f
::
所以它应该按原样工作。只是我需要获得适当的索引来获取该值。是的,现在有意义了。很抱歉这个愚蠢的问题。对于
\d+
:(\d+
(?)?