0

我正在尝试使用 RegEx 转义 MDX 成员引用,但未成功。

这是输入字符串:

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

这是我试图输出的内容:

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

(注意双右方括号)

我将如何使用 .Net 使用 RegEx 完成此操作?

更多示例:

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]]] 
4

2 回答 2

1

规则非常简单 insert ] on ] 但只有在 [

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 为假,那么甚至没有理由进行比较。

于 2012-10-02T20:19:40.010 回答
0

不需要循环。.我们希望匹配除最后一个和紧接在点 ( ) 分隔符之前的每个右括号。我们只要求我们的右括号后面跟着一个字符,并指定它必须是一个非点字符。我不确定正确的 .NET 方式来表达这一点,但您想要匹配]([^\.])并替换]]$1where$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:在最初的答案中,匹配模式给]([^\.])出了点 ( .) 转义以指示它是文字点字符。根据您的语言,您可能需要转义匹配中的其他字符。

于 2012-10-02T20:19:43.660 回答