例如我有这个字符串:
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
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句