如何找到正则表达式的所有耦合支架?

时间:2009-11-13 02:49:13

标签: c# regex

我希望有一个正则表达式来查找所有花括号,并用其他字符串替换它们。

例如,我想将“ {foo} ”替换为“ {FOO ”,将“ {bar} ”替换为“ BAR “和” {} “与” EMPTY “。如果输入为“ abc {foo} def {bar} {} ”,则输出为“ abc FOO def BAR EMPTY ”。

不允许嵌套括号或未耦合括号。如果需要字符“{”或“}”。它应该加倍。因此,“{{def}}”只是“{def}”。

不允许使用{}中的其他字符串。说,我只想要“ {foo} ”和“ {bar} ”。因此,“ abc {xyz} def ”应被视为无效输入。

2 个答案:

答案 0 :(得分:3)

如果您有可用的负面观察/前瞻:

(?<!{){([a-z]+)}(?!})

并替换为匹配组的值。

([a-z]+)与您收录的字符串匹配,(?<!{)确保{之前没有第二个{,而(?!})会产生}确保}之后没有第二个(?^|[^{]){([a-z]+)}(?$|[^})

如果你没有lookbehinds / lookaheads,那么

{{1}}

答案 1 :(得分:0)

我会先使用{}替换EMPTY而不使用正则表达式。

然后使用

(?<!{){(foo|bar)}(?!})

匹配{foo}{bar}但不匹配{}{{anything}}{anything}

反向引用号1包含匹配的文本。

因此代码段可能看起来像

Regex matches = new Regex(@"(?<!\{)\{(foo|bar)\}(?!\})", RegexOptions.IgnoreCase);
resultString = matches.Replace(subjectString, "$1".ToUpper());

(我希望在字符串上调用ToUpper()有效;我不知道C#,所以如果我错了请纠正我)