C # Regex для изменения вхождений [в [[] и] в []] - PullRequest
2 голосов
/ 03 апреля 2012

У меня есть путь + имя файла, который содержит [] несколько раз. То, что я хочу сделать, это поместить [] вокруг каждого [как так:

E: \ Test \ Bananas [в клетке], когда [слоны] смеются.png

Заменено на

E: \ Test \ Bananas [[] в клетке []], когда [[] elephants [] ]augh.png

Причина этого здесь:

DataRow[] tempRows = filenames.Select("File like '" + tempLogElement + "'");

Сбой при появлении пути, содержащего квадратные скобки. Это потому, что [] используются для экранирования * и% в таком выражении типа «как». Чтобы избежать этого, нужно избегать escape-символов ....

Я не удивительный в Regex, но я получил примерно здесь:

Regex.Replace(tempLogElement, "(\[*\])", "[]]", RegexOptions.IgnoreCase);

Это только экранирует символ], но не [символ.

Это не будет работать:

tempLogElement.Replace("[","[[]").Replace("]","[]]")

Вторая замена испортит первую замену. Поэтому я решил, что мне нужно использовать что-то, что сделало это за одну операцию. И первое, что пришло в голову, это Regex.

Ответы [ 5 ]

4 голосов
/ 03 апреля 2012

Вот краткий пример:

Regex.Replace(input, @"\[|\]", "[$0]")

Это соответствует либо [ или ] и заменяется на [ ... ], содержащее оригинальный символ.

3 голосов
/ 03 апреля 2012

Regex-менее

tempLogElement.Replace("[", "[[").Replace("]", "[]]").Replace("[[", "[[]");
1 голос
/ 03 апреля 2012
Regex _formatReplaceRegex = new Regex(@"\[([^\]]*)\]",RegexOptions.IgnoreCase);

string input = @"E:\Test\Bananas[in a cage]when[elephants]laugh.png";
Console.WriteLine(_formatReplaceRegex.Replace(input,"[[[$1]]]" );

- обновление Заменить использовать $ 1 вместо анонимного метода .--

1 голос
/ 03 апреля 2012

Попробуйте

Regex.Replace(tempLogElement, "\[([\w\s]*)\]", "[[]$1[]]", RegexOptions.IgnoreCase);
0 голосов
/ 03 апреля 2012

Почему бы не использовать String.Select?

tempLogElement.Select(o => o == '[' ? "[[]" : (o == ']' ? "[[]" : o.ToString()));

или использовать for iterartion

string temp = tempLogElement, replaced = "";
for (int i = 0; i < temp.Length; i++)
{
    if (temp[i] == '[') replaced += "[[]";
    else if (temp[i] == ']') replaced += "[[]";
    else replaced += temp[i];
}
...