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

本文关键字:条件 创建 正则表达式 何根 | 更新日期: 2023-09-27 18:32:53

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

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

输入字符串stackOVERFlow

预期输出stack*over*flow

我尝试过,但无法使其完美运行。

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

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

预期的输入和输出有点不合逻辑:你在"flow"中将"f"小写,但不将其包含在星号中。

无论如何,您想要的正则表达式非常简单: @"[A-Z]+?" .这会非贪婪地匹配一个或多个大写字母字符的字符串(不要认为它有什么区别,因为匹配的字符类相对较窄)。

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

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

这只会查找一个或多个大写字母字符的所有匹配项,无论在哪里找到匹配项,它都会将其替换为用星号括起来的自身。这执行周围但不执行小写;.NET Regex 不提供这种字符串修改。但是,由于操作的最终结果应该是包含所有小写字符的字符串,因此只需使用 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(?=suffix),它找到后缀之前的位置。