在字符串中找到十六进制数,然后将其转换为十进

时间:2016-01-25 12:49:41

标签: c# regex

让我们说我收到了多个不同的字符串,比如

"private var color:uint = 0xff000010"
"private var something:uint = 0xf2010"
"private var anotherNumber:int = 5435344"

我想检查字符串是否包含十六进制数,是否有一个用十进制值替换它。 对于转换,我认为这就足够了:

string hexToDecimal = int.Parse(color, System.Globalization.NumberStyles.HexNumber).ToString();

但我是正则表达式的新手,我很难用完整的算法来查找,然后以简单的方式替换十六进制。

我非常感谢任何帮助。 提前谢谢。

更新 这是它应该能够转换的另一个例子:

"private var color:uint = 0xff000010 0x00000ff \n0xffffff"

2 个答案:

答案 0 :(得分:3)

对匹配评估者使用Regex.Replace重载(请参阅demo):

var s = "private var color:uint = 0xff000010\nprivate var something:uint = 0xf2010\nprivate var anotherNumber:int = 5435344";
var res = Regex.Replace(s, @"(?i)\b0x([a-f0-9]+)\b", m => Hex2Dec(m.Groups[1].Value));
Console.WriteLine(res); 

评估方法

public static string Hex2Dec(string m)
{
    return int.Parse(m, System.Globalization.NumberStyles.HexNumber).ToString();
}

输出:

private var color:uint = -16777200
private var something:uint = 991248
private var anotherNumber:int = 5435344

正则表达式匹配:

  • (?i) - 使模式不区分大小写
  • \b - 字边界
  • 0x - 0x
  • 的文字序列
  • ([a-f0-9]+) - 第1组匹配a-f0-9个字符范围内的一个或多个字符
  • \b - 尾随字边界

答案 1 :(得分:0)

这应该有效:

        string input = "private var color:uint = 0xff000010";

        Match match = Regex.Match(input, @".*(0x[0-9a-fA-F]+).*", RegexOptions.IgnoreCase);

        if (match.Success)
        {
            string key = match.Groups[1].Value;

            uint hexToDecimal = (uint)new System.ComponentModel.UInt32Converter().ConvertFromString(key);
            input = input.Replace(key, hexToDecimal.ToString());          
        }

十六进制数在输入变量中更改,如果匹配