【问题标题】:using .NET Regex.Replace() to replace expression more than once [duplicate]使用 .NET Regex.Replace() 多次替换表达式 [重复]
【发布时间】:2016-04-15 05:30:43
【问题描述】:

我似乎找不到这个问题的匹配项,所以如果它是重复的,我提前道歉。

给定模板:<<FirstName>> << FirstName >>

我想使用应该匹配两者的单个正则表达式替换'<<>>' 之间的两个字符串。

以下代码似乎没有按我预期的方式工作:

[Test]
public void ShouldReplaceMultiple()
{
  var pattern = "<<.*FirstName.*>>";
  var template = "<<FirstName>> <<FirstName>>";
  var replaceWith = "FOO";

  var regex = new Regex(pattern); 

  Assert.AreEqual("FOO FOO", regex.Replace(template, replaceWith));
}

测试的输出如下:

Expected string length 7 but was 3. Strings differ at index 3.
  Expected: "FOO FOO"
  But was:  "FOO"
  --------------^

我不明白为什么两个字符串都不会被替换?

【问题讨论】:

    标签: c# .net regex replace


    【解决方案1】:

    使用.*?使其不贪婪

    var pattern = "<<.*?FirstName.*?>>";
    var template = "<<FirstName>> <<FirstName>>";
    var replaceWith = "FOO";
    
    var regex = new Regex(pattern); 
    
    Console.WriteLine(regex.Replace(template, replaceWith));
    

    Ideone Demo

    如果你只想处理&lt;&lt;&gt;&gt;之间的spaces,那么这就足够了

    <<\s*?FirstName\s*?>>
    

    【讨论】:

    • > 与您的模式匹配。
    • @M.S.根据 OP :- I want to replace both strings between the '&lt;&lt;&gt;&gt;''s using a single regex ..also OP 在模式中使用 .*
    【解决方案2】:
    string pattern = @"<<(?<=<<)\s*FirstName\s*(?=>>)>>";
    var template = "<<FirstName>> <<FirstName>>";
    var replaceWith = "FOO";
    
    var regex = new Regex(pattern); 
    
    Assert.AreEqual("FOO FOO", regex.Replace(template, replaceWith));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      相关资源
      最近更新 更多