Подтвердить что ты не робот

Регулярное выражение заменяется на С#

Я новичок в использовании регулярных выражений, и, основываясь на нескольких учебниках, которые я прочитал, я не могу правильно выполнить этот шаг в своем Regex.Replace.

Здесь сценарий, над которым я работаю... Когда я извлекаю свои данные из списка, я хочу отформатировать его в CSV как формат, а затем сохраните файл. Использует ли параметр "Заменить" идеальное решение для этого сценария?

Перед форматированием регулярного выражения.

FirstName LastName Salary    Position
-------------------------------------
John      Smith    $100,000.00  M

Предлагаемый формат после регулярного выражения заменяет

John Smith,100000,M

Текущий статус состояния форматирования:

John,Smith,100000,M

* Примечание. Есть ли способ заменить первую запятую пробелом?

Фрагмент моего кода

using(var fs = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.Write))
{
    using(var sw = new StreamWriter(fs))
    {
        foreach (string stw in listBox1.Items)
        {
            StringBuilder sb = new StringBuilder();
            sb.AppendLine(stw);

            //Piecing the list back to the original format
            sb_trim = Regex.Replace(stw, @"[$,]", "");
            sb_trim = Regex.Replace(sb_trim, @"[.][0-9]+", "");
            sb_trim = Regex.Replace(sb_trim, @"\s", ",");
            sw.WriteLine(sb_trim);
        }
    }
}
4b9b3361

Ответ 1

Вы можете сделать это с помощью двух элементов замены

//let stw be "John Smith $100,000.00 M"

sb_trim = Regex.Replace(stw, @"\s+\$|\s+(?=\w+$)", ",");
//sb_trim becomes "John Smith,100,000.00,M"

sb_trim = Regex.Replace(sb_trim, @"(?<=\d),(?=\d)|[.]0+(?=,)", "");
//sb_trim becomes "John Smith,100000,M"

sw.WriteLine(sb_trim);

Ответ 2

Попробуйте следующее:

sb_trim = Regex.Replace(stw, @"(\D+)\s+\$([\d,]+)\.\d+\s+(.)",
    m => string.Format(
        "{0},{1},{2}",
        m.Groups[1].Value,
        m.Groups[2].Value.Replace(",", string.Empty),
        m.Groups[3].Value));

Это будет как чистый ответ, как вы получите, по крайней мере с регулярными выражениями.

  • (\D+): первая группа захвата. Один или несколько несимметричных символов.
  • \s+\$: один или несколько символов пробела, затем буквальный знак доллара ($).
  • ([\d,]+): вторая группа захвата. Одна или несколько цифр и/или запятая.
  • \.\d+: Десятичная точка, тогда как минимум одна цифра.
  • \s+: один или несколько символов пробела.
  • (.): Третья группа захвата. Любой символ, отличный от строки.

Вторая группа захвата дополнительно должна иметь свою запятую. Вы можете сделать это с другим регулярным выражением, но это действительно не нужно и плохо для производительности. Вот почему нам нужно использовать выражение лямбда и строковый формат, чтобы объединить замену. Если бы не это, мы могли бы просто использовать это как замену вместо выражения лямбда:

"$1,$2,$3"

Ответ 3

Добавьте следующие 2 строки

var regex = new Regex(Regex.Escape(","));
sb_trim = regex.Replace(sb_trim, " ", 1);

Если sb_trim = John, Smith, 100000, M, приведенный выше код вернет "John Smith, 100000, M"