2016-09-19 44 views
2

我正在处理将所有未知(未知=其他可用)字符替换为由我选择的一个字符(例如'?')的C#代码。可用字符可以是单个字符,或两个或多个字符的序列替换字符中未包含的所有字符或序列列表

例如:

Input string: [email protected]@CZ 
Available characters or sequences: A, B, C, @@ 
Desired output: [email protected]@C? 

其他例如:

Input string: [email protected] 
Available characters or sequences: A, B, C, @@ 
Desired output: A?B??C? 

我想要实现这个使用正则表达式表达。我到了解决方案最接近的是这样的正则表达式:

([email protected]@|[ABC]). 

但在这样将导致错误的结果输入字符串的例子:

Input string: [email protected]@CZ 
Result from above regex: [email protected]?C? 
Instead of wanted by me: [email protected]@C? 

如何,我可以实现我的目标?

+3

匹配它们并加入匹配值。 –

+0

你能为我的例子发布一个正则表达式吗? – user1558211

+0

问题是,你只消耗一个字符与你的否定前瞻断言。第一个@匹配,但第二个将被删除。你可以用这个正则表达式来实现:['(?<!@)@(?!@)| [^ ABC @]'](http://regexstorm.net/tester?p=(%3f%3c!% 40)%40(%3f!%40)%7c%5b%5eABC%40%5d&i = AXBY%40%40CZ&r =%3f)但使用WiktorStribiżew的提示要简单得多。 –

回答

3

样本Wiktor的Stribiżew的提示:

var str = "[email protected]@[email protected]"; 
var matches = Regex.Matches(str, "@@|[ABC]").Cast<Match>(); 
var replaced = string.Join("?", matches.Select(x => x.Value)); 
Console.WriteLine(replaced); 

DEMO

返回[email protected]@?C?A FO r输入[email protected]@[email protected]

请记住德米特里Bychenko的暗示。这个样本不回答他的问题。

+0

是的,我会这样做。这可以根据要求进一步增强。 –

-1

这里是你开始使用什么Regex

string input = "[email protected]@CZ"; 
string output = Regex.Replace(input, "[^[email protected]]+", "?"); 
Console.WriteLine("Result: {0}", output); 
//Result: [email protected]@C? 

记住添加using System.Text.RegularExpressions;

+0

这不是OP正在寻找的东西。一个'@'应该被替换。只有双“@”不应该。 –

+0

你是对的,我的坏。 – DarKalimHero

相关问题