C # Regex заменить помощь - PullRequest
5 голосов
/ 21 января 2010

У меня есть строка:

Apple1231 | C: \ asfae \ drqw \ Qwer | 2342 | 1.txt

У меня есть следующий код:

 Regex line2parse = Regex.Match(line,@"(\|)(\|)(\|)(\d)");
 if (line2parse < 2)
 {

     File.AppendAllText(workingdirform2 + "configuration.txt",

Что я хочу сделать, это заменить каждый | после первого | на \ Поэтому я хочу выписать

Apple1231 | C: \ asfae \ drqw \ Qwer \ 2342 \ 1.txt

Ответы [ 8 ]

9 голосов
/ 21 января 2010

Вы можете сделать это без регулярного выражения:

string line = @"Apple1231|C:\asfae\drqw\qwer|2342|1.txt";
string[] parts = line.Split('|');
string clean = parts[0] + "|" + string.Join(@"\", parts, 1, parts.Length - 1);

В вызове string.Join используется перегрузка, позволяющая указать начальный индекс для пропуска первого элемента.

4 голосов
/ 21 января 2010

Я бы не использовал Regex, но IndexOf () сначала нашел «|», а затем заменил на .Substring () из этой позиции плюс 1 до конца ... априори, он должен работать лучше - но как всегда происходит с производительностью, реальность удивляет ☺

1 голос
/ 22 января 2010

+ 1 Джон. Очевидно, регулярные выражения не являются лучшим решением здесь, но вот мое мнение:

string original = @"Apple1231|C:\asfae\drqw\qwer|2342|1.txt";
Regex pattern = new Regex(@"(?<=.*\|)(?'rep'[^\|]*)\|");
string result = pattern.Replace(original, @"${rep}\");

Это более общее, чем строго необходимое, поскольку оно будет обрабатывать произвольное количество замен.

0 голосов
/ 22 января 2010

Это решение создает только два новых объекта в куче, а не N объектов, которые требуются другим решениям.

static string FixString(string line)
{
    if (line == null)
        return string.Empty;

    int firstBarPosition = line.IndexOf('|');
    if (firstBarPosition == -1 || firstBarPosition + 1 == line.Length)
        return line;

    StringBuilder sb = new StringBuilder(line);

    sb.Replace('|', '\\', firstBarPosition + 1, line.Length - (firstBarPosition + 1));
    return sb.ToString();
}
0 голосов
/ 22 января 2010

Вот код, который должен сделать трюк:

Regex MyRegex = new Regex(
      @"(.+\|)(.+)\|(\d{1,})\|(.+)",
    RegexOptions.IgnoreCase
    | RegexOptions.CultureInvariant
    | RegexOptions.IgnorePatternWhitespace
    | RegexOptions.Compiled
    );


// This is the replacement string
string MyRegexReplace = 
      @"$1$2\$3\$4";


//// Replace the matched text in the InputText using the replacement pattern
string result = MyRegex.Replace(@"Apple1231|C:\asfae\drqw\qwer|2342|1.txt",MyRegexReplace);
//
result 'Apple1231|C:\asfae\drqw\qwer\2342\1.txt'

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

0 голосов
/ 22 января 2010

Не используйте регулярные выражения.

        string input = @"Apple1231|C:\asfae\drqw\qwer|2342|1.txt";
        int firstPipeIndex = input.IndexOf("|");
        string suffix = string.Empty;
        string prefix = string.Empty;
        string output = string.Empty;
        if (firstPipeIndex != -1)
        {
            //keep the first pipe and anything before in prefix
            prefix = input.Substring(0, firstPipeIndex + 1);
            //all pipes in the rest of it should be slashes
            suffix = input.Substring(firstPipeIndex + 1).Replace('|', '\\');
            output = prefix + suffix;
        }
        if (!string.IsNullOrEmpty(suffix))
        {
            Console.WriteLine(input);
            Console.WriteLine(output);
        }
0 голосов
/ 21 января 2010

Полностью не проверено, но попробуйте

fixed = Regex.Replace(unfixed.replace("|", @"\"), @"\\", "|", 1);

, то есть - превратить все полосы в косую, а затем превратить первую косую черту в полосу.

0 голосов
/ 21 января 2010

Так как вы запросили регулярное выражение:

var result = Regex.Replace( line, @"(.+?)\|(.+?)\|(.+?)\|(.+?)", "$1|$2\\$3\\$4");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...