正则表达式匹配base64字符串并删除不匹配的文本/字符

时间:2018-12-06 11:49:38

标签: c# regex encoding base64

我有一个有效以Base 64编码的字符串-someBase64String,其中已经添加了无效后缀(例如_002_CWLP265MB136330847F70EDE0813A5AC4C3A80CWLP265MB1363GBRP_--)。

我想字符串拆分回有效以Base 64编码的前缀和无效后缀。

这匹配基本为64的编码字符串

Regex rg = new Regex("^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$"); 

rg.Match(someBase64String)如果是有效的基数64字符串,将返回true

在添加到someBase64String时,此字符串-_002_CWLP265MB136330847F70EDE0813A5AC4C3A80CWLP265MB1363GBRP_--被添加到base64encoded string的末尾,从而导致整个字符串的转换。  base64字符串失败。 rg.Match(someBase64String)也将返回false。

在base64字符串无效的情况下(如上所述),我需要提取导致转换失败的字符串的部分/字符;即_002_CWLP265MB136330847F70EDE0813A5AC4C3A80CWLP265MB1363GBRP_--

1 个答案:

答案 0 :(得分:1)

为什么不借助 Linq 过滤掉字符?如果您要采用个基数为64的符号,直到后缀无效,请使用Take代替Skip

 string wrongSince = string.Concat(source
   .SkipWhile(c => c >= 'A' && c <= 'Z' ||
                   c >= 'a' && c <= 'z' ||
                   c >= '0' && c <= '9' ||
                   c == '+' ||
                   c == '/'));

测试:

string valid = "ABC+DEF+123";
string suffix = "_002_CWLP265MB136330847F70EDE0813A5AC4C3A80CWLP265MB1363GBRP_--";

string source = valid + suffix;

string wrongSince = string.Concat(source
   .SkipWhile(c => c >= 'A' && c <= 'Z' ||
                   c >= 'a' && c <= 'z' ||
                   c >= '0' && c <= '9' ||
                   c == '+' ||
                   c == '/'));

 string correctPrefix = string.Concat(source
   .TakeWhile(c => c >= 'A' && c <= 'Z' ||
                   c >= 'a' && c <= 'z' ||
                   c >= '0' && c <= '9' ||
                   c == '+' ||
                   c == '/'));

Console.WriteLine(wrongSince);
Console.WriteLine(correctPrefix); 

结果:

_002_CWLP265MB136330847F70EDE0813A5AC4C3A80CWLP265MB1363GBRP_--
ABC+DEF+123