匹配所有' X'来自' Y'直到' Z'

时间:2017-03-16 18:45:32

标签: c# .net regex

嗯,我希望标题不会太混乱。我的任务是匹配(并替换)XY之间的所有Z

我使用X,Y,Z,因为这些值在运行时可能会有所不同,但这根本不是问题。

我到目前为止所做的是:

pattern = ".*Y.*?(X).*?Z.*";

哪个实际有效..但仅适用于一个X。我无法弄清楚,如何匹配这些"标签之间的所有X"。

我也试过这个:

pattern = @"((Y|\G).*?)(?!Z)(X)"

但这会匹配所有X,忽略"标记"。

解决问题的正确模式是什么?在此先感谢:)

修改

更多信息:

X是一个charYZstrings

更真实的测试字符串:

Some.text.with.dots [nodots]remove.dots.here[/nodots] again.with.dots

=>在.[nodots]之间匹配[/nodots]

(注意:我在这里使用了类似xml的语法,但这并不能保证,所以我不幸不能使用简单的xml或html解析器)

1 个答案:

答案 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 
        )
    );

请参阅C# online demo

模式详情

  • (?s) - RegexOptions.Singleline修饰符标记的内嵌版本
  • (\[nodots]) - 第1组:开始分隔符(文字字符串[nodots]
  • (.*?) - 第2组:尽可能少的0个字符
  • (\[/nodots]) - 第3组:结束分隔符(文字字符串[/nodots]