2015-12-09 72 views
-3

我需要取值CS5999-1并将其转换为678359991.基本上用相同的ASCII值替换任何字母字符并去掉破折号。我需要摆脱非数字字符,并使值唯一(一些数据进来是全部数字,我确定这将使记录唯一)。字符串转换 - 删除一些字符并用ASCII码替换非数字

我玩过正则表达式,可以用空字符串替换字符,但不知道如何用ASCII值替换字符。

代码仍然停留在.NET 2.0(美国公司),以防万一任何想法。

我已经尝试了几种不同的方法来做到这一点,没有我不希望SO成员为我写代码。我正在寻找想法。

用空字符串替换字母字符我已使用: strResults = Regex.Replace(strResults,@“[A-Za-z \ s]”,string.Empty);

此循环将用自己替换字符。基本上,如果我可以替换找到一种方法来替换ACSII值的替换值我会拥有它,但试图将char值转换为int和我发现的其他几种不同的方法,并且都出现了一个错误。

foreach (char c in strMapResults) 
    { 
    strMapResults = strMapResults.Replace(c,c); 
    } 
+4

能否请您发布的代码,如果你尝试过什么。 –

+0

如果内容包含其他ASCII字符,例如,您希望结果如何' “+ = />”'?你是否也需要这些被剥离,或者你能保证他们不会到达输入? –

+0

Simon我知道这些值不会包含任何其他的ASCII字符,因为提供这个字符的源系统不允许这些字符。源系统只允许A-Z,然后将短划线作为数据字段的一部分。 – Steve

回答

3

检查每个字符是否在a-z范围内。如果是这样,请将ASCII value添加到列表中,如果它位于0-9范围内,则只需添加该号码即可。

public static string AlphaToAscii(string str) 
{ 
    var result = string.Empty; 
    foreach (char c in str) 
    { 
     if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) 
      result += (int)c; 
     else if (c >= '0' && c <= '9') 
      result += c; 
    } 
    return result; 
} 

字母数字范围之外的所有字符(如-)将被忽略。

如果您在特别大的字符串上运行此功能或想要获得更好的性能,您可能需要使用StringBuilder而不是+=

2

对于ASCII范围内的所有字符,其编码值与Unicode代码点相同。 ISO/IEC 8859-1和UCS-2也是如此,但不是其他传统编码。

由于UCS-2与UCS-2(包含所有ASCII字符,如上所示)中的值相同,因为.NET char是UTF-16单元,所有你需要做的只是投到int

var builder = new StringBuilder(str.Length * 3); // Pre-allocate to worse-case scenario 
foreach(char c in str) 
{ 
    if (c >= '0' && c <= '9') 
    builder.Append(c); 
    else if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) 
    builder.Append((int)c); 
} 
string result = builder.ToString(); 
+0

虽然一个很好的答案,我认为_Unicode的讨论; UCS-2;当OP仅提及ASCII时,UTF-16_可能是无关紧要的,并且有点令人困惑。也许包括它作为一个脚注? :) – MickyD

+2

其实不应该'c> = 0 && c <= 9' be 'c > ='0'&& c <='9''什么的? – MickyD

+1

是的,有一个错字。没有看到它是如何脱离主题的,关于Unicode,UCS-2和UTF-16的位就是这个答案。最后的示例代码是可以删除的位。 –

1

如果你想知道如何用正则表达式(你在你的问题中提到过正则表达式)做到这一点,这里有一种方法来做到这一点。

下面的代码过滤所有非数字字符,将字母转换为其ASCII表示,并转储其他任何内容,包括所有非ASCII字母字符。请注意,将(int)char等同于字符的ASCII值仅适用于字符在ASCII字符集中真正可用的情况,这对于A-Za-z来说很明显。

MatchEvaluator filter = match => 
{ 
    var alpha = match.Groups["asciialpha"].Value; 
    return alpha != "" ? ((int) alpha[0]).ToString() : ""; 
}; 

var filtered = Regex.Replace("CS5999-1", @"(?<asciialpha>[A-Za-z])|\D", filter); 
+1

也很好地使用组名称来记录表达式在做什么。 –

0

试试这个

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

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string input = "CS5999-1"; 
      MatchEvaluator evaluator = new MatchEvaluator(Replace); 
      string results = Regex.Replace(input, "[A-Za-z\\-]", evaluator); 
     } 
     static string Replace(Match match) 
     { 
      if (match.Value == "-") 
      { 
       return ""; 
      } 
      else 
      { 
       byte[] ascii = Encoding.UTF8.GetBytes(match.Value); 
       return ascii[0].ToString(); 
      } 
     } 
    } 
} 
​ 
+0

问问题的人对Regex很熟悉,但并不知道评估者。答案不需要额外的评论和海报的经验。 – jdweng