我需要取值CS5999-1并将其转换为678359991.基本上用等效的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);
}
答案 0 :(得分:3)
检查每个字符是否在a-z范围内。如果是这样,请将ASCII value添加到列表中,如果它在0-9范围内,只需添加该号码。
-
字母数字范围之外的所有字符(例如+=
)都将被忽略。
如果您在特别大的字符串上运行此功能或想要更好的性能,您可能需要使用StringBuilder代替{{1}}。
答案 1 :(得分:2)
对于ASCII范围内的所有字符,编码值与Unicode代码点相同。 ISO / IEC 8859-1和UCS-2也是如此,但与其他遗留编码无关。
由于UCS-2与UCS-2中的值(包括所有ASCII字符,如上所述)的UTF-16相同,并且因为.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();
答案 2 :(得分: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);
答案 3 :(得分: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();
}
}
}
}