复杂过滤器在c#中查找字符串的一部分

时间:2018-04-19 22:28:06

标签: c#

我有一个我需要解析的字符串,但我不确定如何不使用大量的if语句和子字符串。这是我使用“”拆分的csv文件中的字符串示例,因为我无法使用逗号。

  

偏移:23,123长度:504更多文字更多文字213I

     

偏移量:23,123长度:504更多文字

     

偏移量:23,123长度:504

     

偏移:23长度:504,10更多文字更多文字213I

我需要的是Length之后的数值:

欢迎任何帮助。之前已经问过这类问题但不满足我的问题。我不知道如何使用正则表达式。

2 个答案:

答案 0 :(得分:0)

您可以使用正则表达式和Expresso之类的工具来构建和测试正则表达式

public static Regex regex = new Regex("Length:\\s*(\\d+)", RegexOptions.CultureInvariant | RegexOptions.Compiled);
static void Main()
{
    var testValue = "Offset: 23,123 Length: 504";
    var match = regex.Match(testValue);
    if (match.Success)
    {
        Console.WriteLine($"Length is {match.Groups[1].Value}");
    }
}

正则表达式是Length:\s*(\d+)说明:Length:后面跟着0个或更多的空格,然后需要捕获1个或更多个数字的组。

答案 1 :(得分:0)

这是一种没有正则表达式的方法:

  1. 从您正在搜索的字词结束开始抓取.Substring
  2. 使用Linq扩展方法TakeWhile获取该字符char.IsDigittrue时的字符
  3. 使用string.Concat将字符重新加入字符串
  4. 这是一个示例方法:

    public static string GetNumberAfterKeyword(string input, string keyword)
    {
        // Decide what you want to do if no keyword is found
        if (string.IsNullOrEmpty(input) || !input.Contains(keyword)) return string.Empty;
    
        return string.Concat(input
            .Substring(input.IndexOf(keyword) + keyword.Length)
            .TakeWhile(char.IsDigit));
    }
    

    示例用法:

    private static void Main()
    {
        var sampleData = new List<string>
        {
            "Offset: 23,123 Length: 504 some more text some more text 213I",
            "Offset: 23,123 Length: 504 some more text",
            "Offset: 23,123 Length: 504",
            "Offset: 23 Length: 504,10 some more text some more text 213I"
        };
    
        var keyword = "Length: ";
    
        foreach (var sample in sampleData)
        {
            Console.WriteLine(GetNumberAfterKeyword(sample, keyword));
        }
    
        GetKeyFromUser("\nDone! Press any key to exit...");
    }
    

    <强>输出

    enter image description here

    另一种使用几乎相同逻辑的替代方法是编写一个方法,如果找到一个数字,则返回true并为该值设置out参数。这样可以避免获取空字符串,并使您能够在if条件下使用该方法。

    例如:

    public static bool TryGetNumberAfterKeyword(string input, string keyword, out int result)
    {
        bool foundResult = false;
        result = 0;
    
        if (!string.IsNullOrEmpty(input) && input.Contains(keyword))
        {
            foundResult = int.TryParse(string.Concat(input
                .Substring(input.IndexOf(keyword) + keyword.Length)
                .TakeWhile(char.IsDigit)), out result);
        }
    
        return foundResult;
    }
    

    在使用中,有一些没有关键字或没有数字的其他数据:

    private static void Main()
    {
        var sampleData = new List<string>
        {
            "",
            "Hi",
            "No keyword",
            "Length: No number after length",
            "Length: ",
            "Offset: 23,123 Length: 504 some more text some more text 213I",
            "Offset: 23,123 Length: 504 some more text",
            "Offset: 23,123 Length: 504",
            "Offset: 23 Length: 504,10 some more text some more text 213I"
        };
    
        var keyword = "Length: ";
    
        foreach (var sample in sampleData)
        {
            int result;
    
            if (TryGetNumberAfterKeyword(sample, keyword, out result))
            {
                Console.WriteLine(result);
            }
            else
            {
                Console.WriteLine("Number or keyword is missing");
            }
        }
    
        GetKeyFromUser("\nDone! Press any key to exit...");
    }
    

    <强>输出

    enter image description here