0

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

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

4

1 回答 1

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表达式,它将删除除第一次出现的两个大写字母之外的所有内容。前两个大写字母的特别之处在于它们前面没有两个或更多大写字母。这就是该表达式检查的内容。任何不是大写字母的字符,或者如果它前面至少有两个大写字母,都将被删除。

这可以概括为生成所需模式的东西:

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);
于 2012-07-27T22:04:38.307 回答