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
    修饰符标志的内联版本
  • (\[nodots])
    -组1:起始分隔符(文字字符串
    [nodots]
  • (.*)
    -第2组:任何0+字符尽可能少
  • (\[/nodots])
    -第3组:结束分隔符(文字字符串
    [/nodots]

恐怕您需要提供一个更真实的示例字符串。显然您尝试了
?(X*)
。。。或“X”表示字符序列?请参阅。所有
x
s均属于第1组。或者,我用一个更好的例子编辑了这个问题:)试一试(替换为
$1
)。