我正在寻找与.NET中的Regex.Replace兼容的正则表达式来过滤用户输入到最左边或最右边的有效字符。例如,如果我只需要获得大写字符,我可以这样做:
var userText = "Ukeaf-4DeT";
var userPattern = @"[^A-Z]";
var validText = Regex.Replace(userText, userPattern, string.Empty)
将返回UDT,但我需要userPattern指定最左边的2个有效字符,因此在这种情况下为UD。同样,我需要一个单独的userPattern来执行最右边的2个有效字符(本例中为DT)。
这可能与单个正则表达式模式有关吗?
答案 0 :(得分:1)
这是可能的,但很难看。正如zzzzBov所指出的那样,通常没有理由将所有东西都放在一个正则表达式中。但是很多事情都有可能做到。
string twoFirst = "[^A-Z]|(?<=([A-Z].*){2})[A-Z]";
string twoLast = "[^A-Z]|[A-Z](?=(.*[A-Z]){2})";
string userText = "Ukeaf-4DeT";
string validText = Regex.Replace(userText, twoFirst, string.Empty);
使用twoFirst
表达式,它将删除除首次出现的两个大写字母之外的所有字母。关于两首大写字母的特殊之处在于它们之前没有2个或更多的大写字母。这是此表达式检查的内容。任何不是大写字母的字符,或者如果字母前面至少有两个大写字母,都将被删除。
这可以推广到生成所需模式的东西:
string userText = "Ukeaf-4DeT";
int numOccurrences = 2;
string positivePattern = "[A-Z]";
string negativePattern = "[^A-Z]";
string first = negativePattern + "|(?<=(" + positivePattern + ".*){" + numOccurrences + "})" + positivePattern;
string last = negativePattern + "|" + positivePattern + "(?=(.*" + positivePattern + "){" + numOccurrences + "})";
string validText = Regex.Replace(userText, first, string.Empty);