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

C# 如何根据某些条件创建正则表达式,c#,regex,C#,Regex,我想创建一个正则表达式,根据某些条件查找并替换大写字符 查找字符串中一组大写字符的起始大写字母,并将其替换为小写,并将其替换为起始大写字母之前的*。 如果大写字母后面有任何小写字母,请将大写字母替换为小写字母,并在开始大写字母之前添加* 输入字符串:堆栈溢出 预期输出:stack*over*flow 我试过了,但没能让它完美地工作 你知道如何创建正则表达式吗? 谢谢预期的输入和输出有点不合逻辑:您在“flow”中降低了“f”的大小写,但没有将其包含在星号中 无论如何,您想要的正则表达式非常简单:

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

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

输入字符串
堆栈溢出

预期输出
stack*over*flow

我试过了,但没能让它完美地工作

你知道如何创建正则表达式吗?
谢谢

预期的输入和输出有点不合逻辑:您在“flow”中降低了“f”的大小写,但没有将其包含在星号中

无论如何,您想要的正则表达式非常简单:
@“[A-Z]+?”
。这将匹配由一个或多个大写字母字符组成的字符串,但不一定匹配(因为匹配的字符类相对较窄,所以这两种方式都不会有什么区别)

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

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

这只会查找一个或多个大写字母字符的所有匹配项,只要找到匹配项,就会将其替换为由星号包围的字符。这不包括周围字符,但不包括小写字符。NET正则表达式不提供这种字符串修改。但是,由于操作的最终结果应该是一个包含所有小写字符的字符串,只需使用ToLower()精确地执行此操作,您就会得到预期的结果。

预期的输入和输出稍微不合逻辑:您在“flow”中降低了“f”的大小写,但没有将其包含在星号中

无论如何,您想要的正则表达式非常简单:
@“[A-Z]+?”
。这将匹配由一个或多个大写字母字符组成的字符串,但不一定匹配(因为匹配的字符类相对较窄,所以这两种方式都不会有什么区别)

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

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

这只会查找一个或多个大写字母字符的所有匹配项,只要找到匹配项,就会将其替换为由星号包围的字符。这不包括周围字符,但不包括小写字符。NET正则表达式不提供这种字符串修改。但是,由于该操作的最终结果应该是一个包含所有小写字符的字符串,只需使用ToLower()精确地执行该操作,您就会得到预期的结果。

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(?=后缀)
,它在后缀之前找到一个位置。

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(?=后缀)
,它在后缀之前找到一个位置。

我不相信您的输入/输出与您的描述相符。我不相信您的输入/输出与您的描述相符。