从一个字符读取字符串到另一个

时间:2019-02-17 12:32:13

标签: c# string character

我有以下字符串:

  

FB:77:CB:0B:EC:09 {W:0,623413,X:0,015374,Y:0,005306,Z:-0,781723}

我想读出W,X,Y,Z的值作为浮点数/小数。这些值的长度并不总是相同。

如何在不使用相对位置的情况下从一个字符到另一个字符读取此字符串?

4 个答案:

答案 0 :(得分:11)

我建议将“内部”部分与正则表达式匹配,但首先要手动删除“外部”部分-只是为了使正则表达式尽可能简单。

这是一个完整的示例,其方法将结果返回为Dictionary<string, string>。目前尚不清楚如何将给定的样本值(例如“ 0,623413”)转换为整数,但我将其视为与初始解析分开的任务。

我假设可以从值中删除所有尾随逗号:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

class Test
{
    static void Main()
    {
        string input = "FB:77:CB:0B:EC:09{W: 0,623413, X: 0,015374, Y: 0,005306, Z: -0,781723}";
        var parsed = Parse(input);
        foreach (var entry in parsed)
        {
            Console.WriteLine($"Key = '{entry.Key}', Value = '{entry.Value}'");
        }        
    }

    static readonly Regex regex = new Regex(@"(?<key>[A-Z]+): (?<value>[-\d,]+)");
    static IDictionary<string, string> Parse(string input)
    {
        int openBrace = input.IndexOf('{');
        if (openBrace == -1)
        {
            throw new ArgumentException("Expected input to contain a {");
        }
        if (!input.EndsWith("}"))
        {
            throw new ArgumentException("Expected input to end with }");
        }
        string inner = input.Substring(openBrace + 1, input.Length - openBrace - 2);
        var matches = regex.Matches(inner);
        return matches.Cast<Match>()
            .ToDictionary(match => match.Groups["key"].Value,
                          match => match.Groups["value"].Value.TrimEnd(','));
    }
}

输出:

Key = 'W', Value = '0,623413'
Key = 'X', Value = '0,015374'
Key = 'Y', Value = '0,005306'
Key = 'Z', Value = '-0,781723'

将这些值转换为整数 就像删除逗号,修剪前导零然后使用int.Parse一样简单-但这实际上取决于您想要的结果是什么。

答案 1 :(得分:0)

要回答您的问题,此方法可以:

int GetIntValue(string input, char prefix)
{
  return int.Parse(input.Substring(input.IndexOf($"{prefix}: ") + 3, 1));
}

但是,这将为所有示例输入返回0。我们仅解析零的原因是int解析器无论如何都会忽略它们。

如果我怀疑您不想要整数,而是想要一个完整的数字,请使用以下内容:

decimal GetValue(string input, char prefix)
{
  return decimal.Parse(input.Substring(input.IndexOf($"{prefix}: ") + 3).Split(new[] { ", ", "}" }, StringSplitOptions.None).First());
}

随时用您想要的内容替换decimal

这样称呼它:

var input = "FB:77:CB:0B:EC:09{W: 0,623413, X: 0,015374, Y: 0,005306, Z: -0,781723}";
var W = GetValue(input, 'W'); // 0.623413
var X = GetValue(input, 'X'); // 0.015374
var Y = GetValue(input, 'Y'); // 0.005306
var Z = GetValue(input, 'Z'); // -0.781723

这是要识别前缀的位置,然后从以下数字的开头解析一个子字符串,直到达到分隔符(,})为止。

答案 2 :(得分:0)

static void Main(string[] args) {
        string str = "FB:77:CB:0B:EC:09{W: 0,623413, X: 0,015374, Y: 0,005306, Z: -0,781723}";
        char[] delims = { ':', ' ' };

        var parsed = Parse(str, delims);

        foreach (var p in parsed) {
            Console.WriteLine($"{p.Key} : {p.Value}");
        }
    }

    static Dictionary<string, double> Parse(string input, char[] delims) {
        int first = input.IndexOf('{') + 1;
        int second = input.IndexOf('}');
        string str2 = input.Substring(first, second - first);

        string[] strArray = str2.Split(delims, StringSplitOptions.RemoveEmptyEntries);
        Dictionary<string, double> pairs = new Dictionary<string, double>();

        for (int i = 1; i < strArray.Length; i++) {
            if (double.TryParse(strArray[i].TrimEnd(','), out double result)) {
                pairs.Add(strArray[i - 1], result);
            }

            i++;
        }

        return pairs;
    }

答案 3 :(得分:-1)

这是另一个正则表达式示例,该示例将数字解析为十进制并包含加号和负号。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Globalization;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = "FB:77:CB:0B:EC:09{W: 0,623413, X: 0,015374, Y: 0,005306, Z: -0,781723}";
            string pattern = @"W:\s*(?'W'[-+]?\d+,\d+),\s*X:\s*(?'X'[-+]?\d+,\d+),\s*Y:\s*(?'Y'[-+]?\d+,\d+),\s*Z:\s*(?'Z'[-+]?\d+,\d+)";
            CultureInfo info = new CultureInfo("en");
            info.NumberFormat.NumberDecimalSeparator = ",";

            Match match = Regex.Match(input, pattern);

            decimal W = decimal.Parse(match.Groups["W"].Value, info);
            decimal X = decimal.Parse(match.Groups["X"].Value, info);
            decimal Y = decimal.Parse(match.Groups["Y"].Value, info);
            decimal Z = decimal.Parse(match.Groups["Z"].Value, info);

        }
    }
}