如何根据某些条件创建正则表达式

时间:2012-05-02 20:22:29

标签: c# regex

我想创建一个正则表达式来根据某些条件查找和替换大写字符。

在字符串中查找一组大写字符的起始大写,并在起始大写之前将其替换为小写和*。 如果大写字母后面有任何小写,请在开始大写之前用小写和*替换大写。

输入字符串stackOVERFlow

预期输出stack*over*flow

我试过但是无法让它完美运作。

关于如何创建正则表达式的任何想法? 感谢

2 个答案:

答案 0 :(得分:4)

预期的输入和输出有点不合逻辑:你在“流量”中低于“f”但不包括在星号中。

无论如何,你想要的正则表达式非常简单:@"[A-Z]+?"。这不匹配地匹配一个或多个大写字母字符的字符串(不要认为它会产生任何影响,因为匹配的字符类相对较窄)。

现在,要进行查找/替换,您可以执行以下操作:

Regex.Replace(inputString, @"([A-Z]+?)", "*$1*").ToLower();

这只是查找所有出现的一个或多个大写字母字符,并且无论在何处找到匹配项,它都会将其替换为由星号包围的自身。这是周围但不是小套; .NET Regex不提供这种字符串修改。但是,由于操作的最终结果应该是一个包含所有小写字符的字符串,只需使用ToLower()就可以得到预期的结果。

答案 1 :(得分:0)

KeithS的解决方案可以简化一点

Regex.Replace("stackOVERFlow","[A-Z]+","*$0*").ToLower()

然而,这将产生stack*overf*low,包括恒星之间的f。如果要排除最后一个大写字母,请使用以下表达式

Regex.Replace("stackOVERFlow","[A-Z]+(?=[A-Z])","*$0*").ToLower()

它将产生stack*over*flow

这使用模式find(?=suffix),它在后缀之前找到一个位置。