正则表达式-不带括号的匹配模式

马辛

例如我有这个字符串:

ABCDFFFE[_]XXX[_]O0[_]%[TT]__

我要实现的是,将所有_匹配/更改为?,将所有_匹配/更改为*,但不!那些在括号内。最后一件事是删除括号,但是我可以通过字符串替换来实现。

所以我在正则表达式后的输出应该是这样的:

ABCDFFFE[_]XXX[_]O0[_]*[TT]??

并在字符串替换后(或者也可以使用正则表达式来完成)

ABCDFFFE_XXX_O0_%TT__

提前致谢

威克多·斯特里比尤

由于[...]文本不能嵌套,因此可以使用以下正则表达式:

(\[[^][]*])|[_%]

正则表达式演示

它将[...]把子文本捕获到第1组中(以便我们稍后可以在替换结果中将它们还原),并且仅匹配_%

在如下代码中使用它:

var s = "ABCDFFFE[_]XXX[_]O0[_]%[TT]__";
var result = Regex.Replace(s, @"(\[[^][]*])|[_%]", m =>
            m.Groups[1].Success ? m.Groups[1].Value : m.Value == "_" ? "?" : "*");

m匹配评估部件检查组1匹配,如果是,我们插入m.Groups[1].Value如果不是,则检查m.Value::如果是_,则替换为?(请参阅m.Value == "_" ? "?"),如果不是,则替换为*

更新

要获取结果#2(不带[的字符串)],可以使用

var result = Regex.Replace(te, @"(\[([^][]*)])|[_%]", m =>
            m.Groups[1].Success ? m.Groups[2].Value : m.Value == "_" ? "?" : "*");

该模式(\[([^][]*)])|[_%]会将整体捕获[...]到组1中,并将其中的内容捕获到组2中。如果组1匹配,则将组2初始化,我们可以使用进行引用m.Groups[2].Value

有关两种解决方案,请参见IDEONE演示

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

正则表达式匹配不带“]”开头的括号

来自分类Dev

正则表达式匹配不带“]”开头的括号

来自分类Dev

Scala:正则表达式模式与花括号匹配?

来自分类Dev

“)”匹配括号的正则表达式

来自分类Dev

正则表达式与=匹配的括号

来自分类Dev

正则表达式匹配模式

来自分类Dev

正则表达式模式以匹配{{....}}

来自分类Dev

正则表达式以匹配模式

来自分类Dev

模式匹配 - 正则表达式

来自分类Dev

模式匹配的正则表达式

来自分类Dev

不带花括号的正则表达式

来自分类Dev

正则表达式以匹配括号和JavaScript括号

来自分类Dev

正则表达式匹配括号和大括号

来自分类Dev

不带正则表达式的单词

来自分类Dev

正则表达式匹配正则表达式模式之外的所有内容

来自分类Dev

表达式的正则表达式模式

来自分类Dev

正则表达式嵌套括号

来自分类Dev

带点括号,正则表达式

来自分类Dev

括号中的正则表达式

来自分类Dev

双括号的正则表达式

来自分类Dev

正则表达式中的括号

来自分类Dev

正则表达式-可选括号

来自分类Dev

括号之间的正则表达式

来自分类Dev

表达式不匹配正则表达式

来自分类Dev

正则表达式匹配纠结的表达式

来自分类Dev

使用正则表达式匹配表达式

来自分类Dev

正则表达式匹配多个表达式?

来自分类Dev

正则表达式 URL 表达式匹配

来自分类Dev

匹配不带正则表达式的字符串