正则表达式替换外方括号内的右方括号

时间:2012-10-02 19:34:51

标签: .net regex mdx

我正在尝试使用RegEx转义MDX成员引用失败。

这是输入字符串:

[dim[e]nsion].[this] [member] name]

这是我试图输出的内容:

[dim[e]]nsion].[this]] [member]] name]

(注意双右方括号)

如何使用.Net来完成此操作?

更多例子:

Input:  [dim[en]sion n[a]me ].[this [member] name]

Output: [dim[en]]sion n[a]]me ].[this [member]] name] 

Input:  [[dimension] name].[this member [name]]

Output: [[dimension]] name].[this member [name]]] 

2 个答案:

答案 0 :(得分:1)

规则是非常简单的插入],但仅限于[

之后]
string str = "[dim[e]nsion].[this] [member] name]";
char[] chars = str.ToArray();
StringBuilder sb = new StringBuilder();
bool leftLast = false;
foreach (char c in chars)
{
    sb.Append(c);
    if (c == '[')
    {
        leftLast = true;
    }
    else if (leftLast && c == ']')
    {
        sb.Append(']');
        leftLast = false;
    }
}
Debug.WriteLine(str);
Debug.WriteLine(sb.ToString());

正则表达式会发现每个']'都应该回顾一下 这个char []循环消除了不必要的反向分析 如果lastLeft为false则没有理由进行比较。

答案 1 :(得分:0)

不需要循环。我们希望匹配每个右手括号,但最后一个和紧靠点(.)分隔符之前的那个。我们只需要在右侧括号后跟一个字符,并指定它必须是非点字符。我不确定正确的.NET方式,但你希望在]([^\.])上匹配并替换为]]$1,其中$1是对括号中的内容的反向引用匹配模式。如果您希望输入结尾处有空格,我建议先清理它,因为如果后面跟一个空格,这将替换最后一个]

您可以在此处测试:http://www.regular-expressions.info/javascriptexample.html

编辑1:使用上述测试人员验证:http://imgur.com/a/VfR7W

编辑2:已通过sed验证(需要访问真正的计算机):

~ $ echo "                              
[dim[e]nsion].[this] [member] name]
[dim[en]sion n[a]me ].[this [member] name]
[[dimension] name].[this member [name]]
" > input.txt
~ $ cat input.txt

[dim[e]nsion].[this] [member] name]
[dim[en]sion n[a]me ].[this [member] name]
[[dimension] name].[this member [name]]

~ $ sed 's/]\([^\\.]\)/]]\1/g' input.txt

[dim[e]]nsion].[this]] [member]] name]
[dim[en]]sion n[a]]me ].[this [member]] name]
[[dimension]] name].[this member [name]]]

~ $ 

编辑3:在初始答案中,匹配模式为]([^\.]),点(.)已转义,表示它是文字点字符。根据您的语言,您可能需要在匹配中转义其他字符。