views:

28

answers:

3

In a string, replace every occurrence of <0xYZ> with the character of hex value YZ. The < and > characters will be used only for that purpose, the string is guaranteed to be well formatted.

Example ('0' = 0x30): A<0x30>B => A0B

It's an easy task, but there are many solutions and I was wondering about the best way to do it.

+1  A: 

You can easily do it with a regular expression:

s = Regex.Replace(s, "<0x([0-9a-f]+)>",
      m => Char.ConvertFromUtf32(
                      Int32.Parse(m.Groups[1].Value, NumberStyles.HexNumber))
      ); 

It is probably missing a few error checks. This uses an overload of Regex.Replace that takes a MatchEvaluator.

Kobi
+2  A: 

I think that a regular expression replace is the easiest way:

s = Regex.Replace(
  s,
  @"<0[Xx]([\dA-Fa-f]{2})>",
  m => ((char)Convert.ToInt32(m.Groups[1].Value, 16)).ToString()
);

By matching an exact pattern it places less restrictions on the string, for example that the < and > characters can still be used. Also, if a tag would happen to be malfomed, it will simply be left unchaged instead of causing an exception.

This will replace tags like <0X4A> and <0x4a>, but leave for example <0x04a> unchanged.

Guffa
A: 

Match the number and convert to int then to char.

var str = "A<0x30>B";

var result = Regex.Replace(str, "<0x((\\d|[A-Z])+)>",
    delegate (Match m)
    {
        return ((char)Convert.ToInt32(m.Groups[1].Value, 16)).ToString();
    }, RegexOptions.IgnoreCase);

Output

A0B
BrunoLM