首页 > 解决方案 > 正则表达式 (.NET) 捕获除空格之外的所有内容

问题描述

我正在尝试使用带有单个捕获组的正则表达式来转换以下内容:

[RuleID("MC304")]
[RuleID("MC 304")]
[RuleID("MC 30 4")]

进入这个:

[RuleID("MC304")]
[RuleID("MC304")]
[RuleID("MC304")]

我已经使用这个regex101 示例完成了这个结果,但它非常初级:

我匹配

\[RuleID\("(\w*)\s*(\w*)\s*(\w*)\s*"\)\]

并替换为

[RuleID("$1$2$3")]

我希望能够使用嵌套在捕获组内的非捕获组,这样我就可以替换双引号内的内容,$1而不必连接$1$2$3,但我不相信这是可能的。

如果有人对如何编写比必须(\w*)\s*为每个空间进行复制更可重用的正则表达式有任何指导,我希望我会非常感谢您的帮助!

编辑

我希望这个解决方案对于任何中间有空格的字母数字字符串都是通用的。上面的示例是针对“MC304”的,但它也可以是任何带有空格的数字字母组合。

注意:我使用 Visual Studio 的内置查找和替换功能从RuleID整个解决方案的所有属性中删除空格。

标签: .netregex

解决方案


在对用法的评论中澄清后,您可以使用此模式来匹配您的字符串。请注意,您需要提供搜索字符串的长度(不包括空格)和搜索字符串本身(同样不包括空格)。

([mc304](?:\s+?)?){5}

这通过使用非捕获组来隔离空格,并通过使用字符类来指定哪些字符是合法的。请注意,您不应该在那里重复字母或数字,所以如果您正在寻找“mc300”,您将使用 [mc30] 和长度为 5。不幸的是,这也将匹配 mc030 和 mc003 等......但也许你可以通过在按下替换之前手动确保...


推荐阅读