C# 匹配所有';X';从';Y';直到';Z';
嗯,我希望标题不要太混乱。我的任务是匹配(并替换)介于C# 匹配所有';X';从';Y';直到';Z';,c#,.net,regex,C#,.net,Regex,嗯,我希望标题不要太混乱。我的任务是匹配(并替换)介于Y和Z之间的所有Xs 我使用X,Y,Z,因为这些值在运行时可能会有所不同,但这根本不是问题 到目前为止,我尝试的是: pattern = ".*Y.*?(X).*?Z.*"; 这实际上是有效的。。但仅适用于一个X。我简直搞不懂,如何在这些“标签”之间匹配所有的Xs 我也试过: pattern = @"((Y|\G).*?)(?!Z)(X)" 但这会匹配所有Xs,忽略“标记” 解决我的问题的正确模式是什么?提前感谢:) 编辑 更多信息: X
Y
和Z
之间的所有X
s
我使用X,Y,Z
,因为这些值在运行时可能会有所不同,但这根本不是问题
到目前为止,我尝试的是:
pattern = ".*Y.*?(X).*?Z.*";
这实际上是有效的。。但仅适用于一个X
。我简直搞不懂,如何在这些“标签”之间匹配所有的X
s
我也试过:
pattern = @"((Y|\G).*?)(?!Z)(X)"
但这会匹配所有X
s,忽略“标记”
解决我的问题的正确模式是什么?提前感谢:)
编辑
更多信息:
X
是单个char
,Y
和Z
是字符串
更真实的测试字符串:
Some.text.with.dots [nodots]remove.dots.here[/nodots] again.with.dots
=>在[nodots]
和[/nodots]
(注意:我在这里使用了类似xml的语法,但不能保证这一点,因此很遗憾,我不能使用简单的xml或html解析器)在C#中,如果需要替换某个文本块中的某些文本,可以使用类似于(?s)(开始)(*)(结束)的简单正则表达式来匹配该块
然后在匹配计算器中对匹配的块进行必要的替换
在您的情况下,您可以使用
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
-组1:起始分隔符(文字字符串(\[nodots])
)[nodots]
-第2组:任何0+字符尽可能少(.*)
-第3组:结束分隔符(文字字符串(\[/nodots])
)[/nodots]
?(X*)
。。。或“X”表示字符序列?请参阅。所有x
s均属于第1组。或者,我用一个更好的例子编辑了这个问题:)试一试(替换为$1
)。