Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#如何获取具有多个相同字符的子字符串_C#_Char_Substring - Fatal编程技术网

c#如何获取具有多个相同字符的子字符串

c#如何获取具有多个相同字符的子字符串,c#,char,substring,C#,Char,Substring,我有以下字符串,变量为s: 房间:501,用户:John,型号:XPR500序列号:JK0192,状况:良好 我想提取模型,XPR500和序列,JK0192 我能够通过以下代码获得模型: int pFrom = s.IndexOf("Model: ") + "Model: ".Length; int pTo = s.LastIndexOf(" Serial:"); String model = s.

我有以下字符串,变量为
s

房间:501,用户:John,型号:XPR500序列号:JK0192,状况:良好

我想提取模型,
XPR500
和序列,
JK0192

我能够通过以下代码获得模型:

                int pFrom = s.IndexOf("Model: ") + "Model: ".Length;
                int pTo = s.LastIndexOf(" Serial:");

                String model = s.Substring(pFrom, pTo - pFrom);
但是,我很难获得序列值。我尝试了以下代码:

                int pFromt = s.IndexOf("Serial: ") + "Serial: ".Length;
                int pToT = s.LastIndexOf(", ");

                string serial = s.Substring(pFromt, pToT - pFromt);
但它又回来了

JK0192,状况:良好

我很难从Serial:和下一个逗号中获取所有内容


有人知道我哪里出错了吗?

您可以尝试使用一个简单的正则表达式:

@"Model\:\s([\w\d]*).*Serial\:\s([\w\d]*).*"
以下是一个完整的示例:

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"Model\:\s([\w\d]*).*Serial\:\s([\w\d]*).*";
        string input = @"Room: 501, User: John, Model: XPR500   Serial: JK0192, Condition: Good";
        RegexOptions options = RegexOptions.Multiline;

        foreach (Match m in Regex.Matches(input, pattern, options))
        {
            Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    }
}

希望这会有所帮助

您可以使用字符串分隔符数组。我会使用标题作为分隔符。我不会使用逗号,因为:

  • 逗号并不总是分隔符
  • 您仍然需要删除标题
  • 下面是一些您可以尝试的代码。它使用而不是仅仅手动搜索字符串和解析子字符串

    static void Main(字符串[]args)
    {
    var s=“房间:501,用户:John,型号:XPR500序列号:JK0192,状况:良好”;
    s=s.Replace(“,”,“”);//首先,删除所有逗号
    var分隔符=新字符串[]{“房间:”,“用户:”,“模型:”,“序列:”,“条件:”};
    //使用不假定所有分隔符的顺序或包含的函数
    model=getValue(s,分隔符,“model:”);
    serial=getValue(s,分隔符,“serial:”);
    WriteLine($“Model='{Model}'”);
    WriteLine($“Serial='{Serial}'”);
    Console.ReadLine();
    }
    私有静态字符串getValue(字符串s、字符串[]分隔符、字符串分隔符)
    {
    //查找所查找标题后字符串其余部分开头的索引
    var index=s.IndexOf(delimiter)+delimiter.Length;
    //用所有分隔符拆分字符串的其余部分,取第一项
    返回s.Substring(index).Split(分隔符,StringSplitOptions.RemoveEmptyEntries).First().Trim();
    }
    
    因此,
    有时是分隔符,但并不总是。为什么不在
    型号:XPR500系列:JK0192
    之间?模型和序列之间是空格还是其他字符?另一个字符可以渲染为空格。也可能是一个标签在复制粘贴中丢失了?这正是从另一个源导出数据的方式。型号和序列号之间永远不会有逗号,但在两者之前/之后可能会有更多的逗号。这两者之间总是有多个空格?这些真的是空格吗?实际上是3个空格,不是tab,所以你能把字符串分成3个空格吗?