C#替换字符串,如果它不在{braces}内

时间:2014-06-17 07:18:39

标签: c# regex string

由于不幸的过去选择,我有一个以下格式字符串,如下所示:

# {0}mm {1}mm x {2}mm

它分两个阶段处理,第一个是用简单的字符串替换#字符

formatString = formatString.Replace("#", "foo")

不知何故原始字符串更改为在格式字符串中包含octothorpes:

# {0}mm {1:0.##}mm x {2:0.##}mm

因为我仍然必须将第一个#替换为foo,但string.Replace("#","foo")将替换#的所有出现,从而导致foo {0}mm {1:0foofoo}mm x {2:0.foofoo}mm" < / p>

这就是为什么我只想在#符号不在花括号内时替换{{1}}符号。我认为它可以通过正则表达式实现,但正确的表达并没有出现在我的脑海中。

4 个答案:

答案 0 :(得分:4)

这应该有效:

(?<!{[^{}]*)(?![^{}]*})#

仅在以下情况下匹配:

  1. 前面没有开口大括号,后面没有其他大括号,
  2. 后面没有一个没有其他大括号的右括号,
  3. 这是一个哈希。
  4. 前两个确保你不在支撑对内,但不能从一对支撑到另一对支撑。

    然而如果您希望匹配的哈希仅在开始时出现,那么AlexInTime's solution是一种更好的方法。

答案 1 :(得分:1)

我知道你已经有了一个公认的答案,但是这个问题恰好也有一个非常一般和美丽的解决方案,所以完成后,就是这样。这种情况与"regex-match a pattern, excluding..."

的这个问题非常相似

我们可以通过一个非常简单的正则表达式解决它:

{[^}]*}|(#+)

交替|的左侧匹配完成{curlies}。我们将忽略这些匹配。右侧匹配并捕获哈希#到组1,我们知道它们是正确的,因为它们与左侧的表达式不匹配。

此程序显示了如何使用正则表达式(请参阅online demo底部的结果):

using System;
using System.Text.RegularExpressions;
using System.Collections.Specialized;
class Program
{
static void Main() {
var myRegex = new Regex(@"{[^}]*}|(#+)");
string s1 = @"# {0}mm ####{1:0.##}mm ##x {2:0.##}mm";

string replaced = myRegex.Replace(s1, delegate(Match m) {
if (m.Groups[1].Value != "") return "";
else return m.Value;
});
Console.WriteLine("\n" + "*** Replacements ***");
Console.WriteLine(replaced);


Console.WriteLine("\nPress Any Key to Exit.");
Console.ReadKey();

} // END Main
} // END Program

参考

答案 2 :(得分:0)

你的正则表达式可以像^(#) ^字符串的开头一样简单,(#)一次出现#

如果你真的不知道正则表达式,我绝对可以推荐 http://txt2re.com/ 这是一个非常可视的正则表达式构建器

答案 3 :(得分:-1)

使用Regex.Replace代替String.Replace

请参阅http://msdn.microsoft.com/en-us/library/haekbhys(v=vs.110).aspx

样品

using System.Text.RegularExpressions;
namespace TestReplaceFirst
{
    class Program
    {
        static void Main(string[] args)
        {
        var source = new List<string> { "# {0}mm {1}mm x {2}mm", "# {0}mm {1:0.##}mm x {2:0.##}mm", "{0}mm {1}mm x {2}mm # #", "{0}mm # {1:0.##}mm x {2:0.##}mm" };

        string pattern = "(?<!{[^{}]*)(?![^{}]*})#";
        string replacement = "foo";
        Regex rgx = new Regex(pattern);

        foreach (var str in source)
        {
            string result = rgx.Replace(str, replacement);
            Console.WriteLine("Original String:    '{0}'", str);
            Console.WriteLine("Replacement String: '{0}'", result);
        }
        Console.ReadKey();       
    }
}

输出:

Original String:    '# {0}mm {1}mm x {2}mm'
Replacement String: 'foo {0}mm {1}mm x {2}mm'
Original String:    '# {0}mm {1:0.##}mm x {2:0.##}mm'
Replacement String: 'foo {0}mm {1:0.##}mm x {2:0.##}mm'
Original String:    '{0}mm {1}mm x {2}mm # #'
Replacement String: '{0}mm {1}mm x {2}mm foo #'
Original String:    '{0}mm # {1:0.##}mm x {2:0.##}mm'
Replacement String: '{0}mm foo {1:0.##}mm x {2:0.##}mm'