我正在尝试使用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]]]
答案 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:在初始答案中,匹配模式为]([^\.])
,点(.
)已转义,表示它是文字点字符。根据您的语言,您可能需要在匹配中转义其他字符。