C# 替换字符串中除模式以外的所有字母数字字符

C# 替换字符串中除模式以外的所有字母数字字符,c#,regex,C#,Regex,我试图混淆字符串,但需要保留一些模式。基本上,所有字母数字字符都需要替换为单个字符(例如“X”),但以下(示例)模式需要保留(注意,每个模式在开头都有一个空格) QQQ“ 存款准备金率“ 我已经查看了一些关于消极前瞻/落后的示例,但仍然没有任何运气(只测试QQQ) 这适用于精确匹配,但会以类似“QQR”的方式失败,返回 "XXXX XXXX XXXXX XXXXX XQR""XXXXX""XXXXX"XXXXXXXX 您可以使用以下选项: var regex = new Reg

我试图混淆字符串,但需要保留一些模式。基本上,所有字母数字字符都需要替换为单个字符(例如“X”),但以下(示例)模式需要保留(注意,每个模式在开头都有一个空格)

  • QQQ“
  • 存款准备金率“
我已经查看了一些关于消极前瞻/落后的示例,但仍然没有任何运气(只测试QQQ)

这适用于精确匹配,但会以类似“QQR”的方式失败,返回

"XXXX XXXX       XXXXX XXXXX XQR""XXXXX""XXXXX"XXXXXXXX
您可以使用以下选项:

var regex = new Regex(@"((?> QQQ|[^A-Za-z0-9]+)*)[A-Za-z0-9]");            
var result = regex.Replace(test, "$1X");
这样做的目的是匹配所有必须首先保存的内容,并将其放入捕获组中


由于目标字符前面总是有零个或多个必须保留的内容,因此您只需在
[A-Za-z0-9]之前编写此捕获组

这里有一个非正则表达式的解决方案。虽然在输入序列中有一个模式多次失败,但效果相当不错。它需要一个更好的算法来获取发生率。对于大字符串,您可以将其与正则表达式解决方案进行比较

public static string ReplaceWithPatterns(this string input, IEnumerable<string> patterns, char replacement)
{
    var patternsPositions = patterns.Select(p => 
           new { Pattern = p, Index = input.IndexOf(p) })
           .Where(i => i.Index > 0);

    var result = new string(replacement, input.Length);
    if (!patternsPositions.Any()) // no pattern in the input
        return result;

    foreach(var p in patternsPositions)
        result = result.Insert(p.Index, p.Pattern); // return patterns back

    return result;
}
publicstaticstringreplaceWithPatterns(此字符串输入、IEnumerable模式、字符替换)
{
var patternsPositions=patterns.Select(p=>
新{Pattern=p,Index=input.IndexOf(p)})
。式中(i=>i.Index>0);
var结果=新字符串(替换,输入.Length);
if(!patternsPositions.Any())//输入中没有模式
返回结果;
foreach(模式位置中的var p)
result=result.Insert(p.Index,p.Pattern);//返回模式
返回结果;
}

@hwnd:不,你不能,因为一个
Q
不匹配。我一定是误解了他想做什么。我想他想保留QQQ和RRR+1。也许你应该修改一下正则表达式,使之成为
((?>(?)(?:Q | R{3}“”)*)[a-Z0-9]
,这样它也可以接受双引号和“RRR”(使用ignorecase).这是正确的,我确实想保留QQQ和RRR。唯一的问题是“需要遵循QQQ或RRR,但这很容易解决。谢谢,我在正确的轨道上,但错过了一个基本的部分!我曾考虑过使用非正则表达式版本,因为字符串永远不会太大,但在内心深处,我觉得必须有一种方法来使用正则表达式…我必须确保我对它进行了评论,否则我将在下周忘记它的功能。@tencntraze是的,这正是我对正则表达式的问题:D
var regex = new Regex(@"((?> QQQ|[^A-Za-z0-9]+)*)[A-Za-z0-9]");            
var result = regex.Replace(test, "$1X");
public static string ReplaceWithPatterns(this string input, IEnumerable<string> patterns, char replacement)
{
    var patternsPositions = patterns.Select(p => 
           new { Pattern = p, Index = input.IndexOf(p) })
           .Where(i => i.Index > 0);

    var result = new string(replacement, input.Length);
    if (!patternsPositions.Any()) // no pattern in the input
        return result;

    foreach(var p in patternsPositions)
        result = result.Insert(p.Index, p.Pattern); // return patterns back

    return result;
}