使用正则表达式获取最左边或最右边的有效字符

时间:2012-07-27 19:06:54

标签: .net regex

我正在寻找与.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)。

这可能与单个正则表达式模式有关吗?

1 个答案:

答案 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);