C# - 正则表达式查找包含在'中的所有ascii '并将它们转换为十六进制ascii输出

时间:2016-03-15 11:49:45

标签: c# regex

我为用户输入数据编写了一个转换器,它将数字值字符串和' '中包含的ascii字符转换为十六进制表示。输入数字可以正常使用:

string TestText = "lorem, 'C', 127, 0x06, '#' ipsum";
TestText = Regex.Replace(
    TestText, 
    " +\\d{1,3}", 
    (MatchEvaluator)(match => Convert.ToByte(match.Value).ToString("X2")));         
Out.Text = TestText;

但是如何检测' '中包含的ascii字符并将其转换为十六进制字符串,如:'C'43'+'变为2B

2 个答案:

答案 0 :(得分:0)

基本上,您希望匹配正则表达式'[^']'。这会查找非'但包含在'中的所有字符。

然后,在匹配评估器中,您将获得中间的字符,并将其转换为十六进制字符串。要做到这一点,首先将char投射到int,然后您可以使用ToString("x2")

TestText = Regex.Replace(TestText, "'[^']'",
    (MatchEvaluator)(match => ((int)match.Value[1]).ToString("x2")));

答案 1 :(得分:0)

首先,您需要一个RegEx来捕获'中的字符:"'(.)'"

然后您需要将该字符转换为十六进制等效字符,如下所示:Encoding.ASCII.GetBytes(match.Groups[1].Value).First().ToString("X2")

所以你的最终代码看起来像这样:

string TestText = "lorem, 'C', 127, 0x06, '#' ipsum '+'";
TestText = Regex.Replace(TestText, @" +\d{1,3}", match => Convert.ToByte(match.Value).ToString("X2"));         
TestText = Regex.Replace(TestText, "'(.)'", match => Encoding.ASCII.GetBytes(match.Groups[1].Value).First().ToString("X2"));
Out.Text = TestText;

请注意,正如评论中所指出的,您的RegEx目前与0开头的0x06匹配,这可能不是您想要的。