这是可能的,但很难看。正如 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
表达式,它将删除除第一次出现的两个大写字母之外的所有内容。前两个大写字母的特别之处在于它们前面没有两个或更多大写字母。这就是该表达式检查的内容。任何不是大写字母的字符,或者如果它前面至少有两个大写字母,都将被删除。
这可以概括为生成所需模式的东西:
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);