嗯,我希望标题不会太混乱。我的任务是匹配(并替换)X
和Y
之间的所有Z
。
我使用X,Y,Z
,因为这些值在运行时可能会有所不同,但这根本不是问题。
我到目前为止所做的是:
pattern = ".*Y.*?(X).*?Z.*";
哪个实际有效..但仅适用于一个X
。我无法弄清楚,如何匹配这些"标签之间的所有X
"。
我也试过这个:
pattern = @"((Y|\G).*?)(?!Z)(X)"
但这会匹配所有X
,忽略"标记"。
解决问题的正确模式是什么?在此先感谢:)
更多信息:
X
是一个char
,Y
和Z
是strings
更真实的测试字符串:
Some.text.with.dots [nodots]remove.dots.here[/nodots] again.with.dots
=>在.
和[nodots]
之间匹配[/nodots]
(注意:我在这里使用了类似xml的语法,但这并不能保证,所以我不幸不能使用简单的xml或html解析器)
答案 0 :(得分:2)
在C#中,如果需要替换某些文本块中的某些文本,可以将块与(?s)(START)(.*?)(END)
之类的简单正则表达相匹配,然后在匹配评估器中进行必要的替换。块。
在您的情况下,您可以使用类似
的内容var res = Regex.Replace(str, @"(?s)(\[nodots])(.*?)(\[/nodots])",
m => string.Format(
"{0}{1}{2}",
m.Groups[1].Value, // Restoring start delimiter
m.Groups[2].Value.Replace(".",""), // Modifying inner contents
m.Groups[3].Value // Restoring end delimiter
)
);
模式详情:
(?s)
- RegexOptions.Singleline
修饰符标记的内嵌版本(\[nodots])
- 第1组:开始分隔符(文字字符串[nodots]
)(.*?)
- 第2组:尽可能少的0个字符(\[/nodots])
- 第3组:结束分隔符(文字字符串[/nodots]
)