由于不幸的过去选择,我有一个以下格式字符串,如下所示:
# {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}}符号。我认为它可以通过正则表达式实现,但正确的表达并没有出现在我的脑海中。
答案 0 :(得分: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'