可能ですが、醜いです。zzzzBov が指摘したように、通常、すべてを 1 つの正規表現に収める理由はありません。しかし、できることはいくらでもあります。
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 つの出現を除くすべてが削除されます。最初の 2 つの大文字の特別な点は、それらの前に 2 つ以上の大文字がないことです。これは、この式がチェックするものです。大文字ではない文字、またはその前に少なくとも 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);