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

ルールは非常に単純です [ に ] を挿入しますが、[

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 の場合、比較する理由さえありません。

于 2012-10-02T20:19:40.010 に答える
0

ループは必要ありません。.すべての右角かっこを一致させたいと考えていますが、最後の角かっこと、ドット ( ) 区切り記号の直前にある角かっこを除きます。右角かっこの後に単一の文字が続くことを要求し、それがドット以外の文字でなければならないことを指定するだけです。これを言う適切な .NET の方法についてはわかりませんが、一致パターンの括弧内のものへの後方参照である whereに一致さ]([^\.])せて置き換えたいと考えています。入力の最後に空白があると予想される場合は、最初に空白を削除することをお勧めします。]]$1$1]

ここでテストできます: http://www.regular-expressions.info/javascriptexample.html

編集 1:上記のテスターを使用して検証済み: http://imgur.com/a/VfR7W

EDIT 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 に答える