在C#中分隔字符串中的数字和单位

时间:2016-10-03 16:41:39

标签: c# c++ regex string scanf

我必须用C#,

在C ++中编写相当于此的东西
string val_in;
float val;
char unit[100];

val_in = NoSpace(val_in);

int nscan = sscanf(val_in.c_str(), "%f%s", &val, &unit);

if (nscan < 2) {
    return val_in; //do nothing if scan fail
}

NoSpace()方法修剪并移除val_in中的所有空格。

我已经在这里查看了SO,大多数类似问题涉及包含分隔符(如空格或逗号)的字符串,但不适用于此情况。所以我转向RegEx。

到目前为止,我有这个,

string val_in;
float val;
char[] unit = new char[100];

string[] val_arr;

val_in = NoSpace(val_in);

val_arr = Regex.Split(val_in, @"([-]?\d*\.?\d+)([a-zA-Z]+)");
val = Single.Parse(val_arr[1]);

if (val_arr.Length < 2) {
    return val_in; //do nothing if scan fail
}

它到目前为止有效,但我想知道是否有另一种方法可以做到这一点?我对RegEx有点警惕,因为根据this question上接受的答案,([-]?\d*\.?\d+)代替([-]?(\d*\.)?\d+)因为邪恶的RegEx而具有潜在的危险性。但如果我包括那些额外的括号,那么我有一个额外的组。这会导致Split()将类似123.456miles的内容拆分为包含元素的数组

{emptystr, 123.456, 123., miles}

这样,我无法确定此情况下的单位miles是否在val_arr[2],这是一个问题。

我在this .NET RegEx tester上对此进行了测试。我也试图打破我的RegEx模式,([-]?\d*\.?\d+),但它似乎很好并且“邪恶的RegEx安全”。所以我不确定我是否应该坚持到目前为止所做的工作,或者找到一个更优雅的解决方案,如果存在的话。

1 个答案:

答案 0 :(得分:1)

不是很优雅,但是你不能只查找字符串中的第一个字母来知道你的单位从哪里开始?

  static void SplitValAndUnit(string unsplitData)
  {
     for (int x = 0; x < unsplitData.Length; x++)
     {
        if (Char.IsLetter(unsplitData[x]))
        {
           string value = unsplitData.Substring(0, x);
           // TryParse value to whatever data type
           string unit  = unsplitData.Substring(x, unsplitData.Length - x);
        }
     }
  }