【问题标题】:C# get the position of a whitespace before a special charC# 获取特殊字符前的空白位置
【发布时间】:2021-10-19 02:10:12
【问题描述】:

我正在尝试从字符串中提取 FPS 计数。 此字符串和 FPS 计数可以具有不同的结构和长度。

两个例子是:

"  Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 480x480 [SAR 1:1 DAR 1:1], 868 kb/s, 29.97 fps, 29.97 tbr, 11988 tbn (default)"
"  Stream #0:0: Video: msmpeg4v3 (MP43 / 0x3334504D), yuv420p, 320x240, 744 kb/s, SAR 1:1 DAR 4:3, 29.97 fps, 29.97 tbr, 29.97 tbn"

获取 FPS 计数位置的唯一常量是字符串中数字前面的“fps”和“,”部分。

我可以通过以下方式获取“fps”的位置:processOutput.IndexOf(" fps")

但是因为 FPS 计数可以有不同的长度,我不能使用这个: processOutput.Substring(fpslocation - 5, 5);

有没有办法在数字之前获得“,”部分的位置?然后我可以把它作为开始索引,将“fps”部分的位置作为结束索引。 还是更容易过滤掉这个值?

【问题讨论】:

    标签: c# string substring indexof


    【解决方案1】:

    您可以为此使用常规表达式:

    var match = Regex.Match(input, @"[\d\.]+(?= fps)")
    

    将查找一系列数字和小数点 ([\d\.]+),后跟“fps”;后者不包含在匹配中。

    match.Value 将包含号码。

    【讨论】:

    • 在您的正则表达式中添加单词边界也很有帮助,例如[\d\.]+ (?=\bfps\b)
    【解决方案2】:

    另一种选择是使用带有捕获组的模式,并获取组值。

    \b([0-9]+(?:\.[0-9]+)?) fps\b
    
    • \b 防止部分匹配的单词边界
    • ( 捕获第 1 组
      • [0-9]+(?:\.[0-9]+)? 匹配 1+ 位 0-9 和可选的小数部分
    • )关闭第一组
    • fps 字面匹配
    • \b一个字边界

    查看regex demoC# demo

    例如

    string s = "  Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 480x480 [SAR 1:1 DAR 1:1], 868 kb/s, 29.97 fps, 29.97 tbr, 11988 tbn (default)";
    Match m = Regex.Match(s, @"\b([0-9]+(?:\.[0-9]+)?) fps\b");
    if (m.Success) {
        Console.WriteLine(m.Groups[1].Value);
    }
    

    输出

    29.97
    

    【讨论】:

      猜你喜欢
      • 2015-03-24
      • 1970-01-01
      • 2014-02-14
      • 1970-01-01
      • 2016-02-12
      • 1970-01-01
      • 2019-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多